feat(omp): add lab omp realised during classroom
This commit is contained in:
		| @@ -34,14 +34,14 @@ bool isPiSequentiel_OK(int n) | |||||||
|  \*-------------------------------------*/ |  \*-------------------------------------*/ | ||||||
|  |  | ||||||
| double piSequentiel(int n) { | double piSequentiel(int n) { | ||||||
|     const double delta_x = 1 / (double)n; |     const double dx = 1.0 / (double)n; | ||||||
|     double sum = 0; |     double sum = 0; | ||||||
|     for (int i = 0; i < n; i++) { |     for (int i = 0; i < n; i++) { | ||||||
|     	double xi = i * delta_x; |     	double xi = i * dx; | ||||||
|     	sum += fpi(xi); |     	sum += fpi(xi); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     return sum * delta_x; |     return sum * dx; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------*\ | /*----------------------------------------------------------------------*\ | ||||||
|   | |||||||
| @@ -45,16 +45,14 @@ double piOMPEntrelacerPromotionTab(int n) | |||||||
|     double sum[NB_THREAD]; |     double sum[NB_THREAD]; | ||||||
|  |  | ||||||
|     // Reduction intra thread |     // Reduction intra thread | ||||||
| #pragma omp parallel | #pragma omp parallel { | ||||||
|     { |  | ||||||
|  |  | ||||||
|     const int TID = Omps::getTid(); |     const int TID = Omps::getTid(); | ||||||
|     int s = TID; |     int s = TID; | ||||||
|  |  | ||||||
|     double sum_thread = 0; |     double sum_thread = 0; | ||||||
|  |  | ||||||
|     while (s < n) |     while (s < n) { | ||||||
| 	{ |  | ||||||
|     	double xi = s * delta_x; |     	double xi = s * delta_x; | ||||||
|     	sum_thread += fpi(xi); |     	sum_thread += fpi(xi); | ||||||
|     	s += NB_THREAD; |     	s += NB_THREAD; | ||||||
|   | |||||||
| @@ -37,8 +37,29 @@ bool isPiOMPEntrelacerCritical_Ok(int n) | |||||||
|  |  | ||||||
| double piOMPEntrelacerCritical(int n) | double piOMPEntrelacerCritical(int n) | ||||||
|     { |     { | ||||||
|     //TODO |     const double dx = 1.0 / (double)n; | ||||||
|     return -1; |     const int NB_THREAD = Omps::setAndGetNaturalGranularity(); | ||||||
|  |     int total = 0; | ||||||
|  |  | ||||||
|  | #pragma omp parallel | ||||||
|  |     { | ||||||
|  | 	const int TID = Omps::getTid(); | ||||||
|  | 	int s = TID; | ||||||
|  |  | ||||||
|  | 	double sum_thread = 0; | ||||||
|  |  | ||||||
|  | 	while (s < n) | ||||||
|  | 	    { | ||||||
|  | 	    double xi = s*dx; | ||||||
|  | 	    sum_thread += fpi(xi); | ||||||
|  | 	    s+= NB_THREAD; | ||||||
|  | 	    } | ||||||
|  | #pragma omp critical | ||||||
|  | 	{ | ||||||
|  | 	total += sum_thread; | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |     return total * dx; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------*\ | /*----------------------------------------------------------------------*\ | ||||||
|   | |||||||
| @@ -40,8 +40,26 @@ bool isPiOMPEntrelacerAtomic_Ok(int n) | |||||||
|  */ |  */ | ||||||
| double piOMPEntrelacerAtomic(int n) | double piOMPEntrelacerAtomic(int n) | ||||||
|     { |     { | ||||||
|     // TODO |     const double dx = 1.0 / (double)n; | ||||||
|     return -1; |     const int NB_THREAD = Omps::setAndGetNaturalGranularity(); | ||||||
|  |     int total = 0; | ||||||
|  |  | ||||||
|  | #pragma omp parallel | ||||||
|  | 	{ | ||||||
|  | 	const int TID = Omps::getTid(); | ||||||
|  | 	int s = TID; | ||||||
|  | 	double sum_thread = 0; | ||||||
|  | 	while (s < n) | ||||||
|  | 	    { | ||||||
|  | 	    double xi = s * dx; | ||||||
|  | 	    sum_thread += fpi(xi); | ||||||
|  | 	    s += NB_THREAD; | ||||||
|  | 	    } | ||||||
|  | #pragma omp atomic | ||||||
|  | 	total += sum_thread; | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  |     return total * dx; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------*\ | /*----------------------------------------------------------------------*\ | ||||||
|   | |||||||
| @@ -43,7 +43,18 @@ bool isPiOMPforPromotionTab_Ok(int n) | |||||||
|  */ |  */ | ||||||
| double piOMPforPromotionTab(int n) | double piOMPforPromotionTab(int n) | ||||||
|     { |     { | ||||||
|     //TODO |     const double dx = 1.0 / (double)n; | ||||||
|  |     const int NB_THREAD = Omps::setAndGetNaturalGranularity(); | ||||||
|  |     double total[NB_THREAD] = {0.0}; | ||||||
|  |  | ||||||
|  | #pragma omp parallel for | ||||||
|  |     for(int i = 0; i < n; i++) { | ||||||
|  | 	const int TID = Omps::getTid(); | ||||||
|  | //	double xi = s*dx; | ||||||
|  | //	total[TID] += fpi(xi); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     return -1; |     return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,11 +41,18 @@ bool isPiOMPforReduction_Ok(int n) | |||||||
|  */ |  */ | ||||||
| double piOMPforReduction(int n) | double piOMPforReduction(int n) | ||||||
|     { |     { | ||||||
|     //TODO |     const double dx = 1.0 / (double)n; | ||||||
|     return -1; |     double sum = 0; | ||||||
|  | #pragma omp parallel for reduction(+:sum) | ||||||
|  |     for (int i = 0; i < n; i++) | ||||||
|  | 	{ | ||||||
|  | 	double xi = i * dx; | ||||||
|  | 	sum += fpi(xi); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |     return sum * dx; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| /*----------------------------------------------------------------------*\ | /*----------------------------------------------------------------------*\ | ||||||
|  |*			End	 					*| |  |*			End	 					*| | ||||||
|  \*---------------------------------------------------------------------*/ |  \*---------------------------------------------------------------------*/ | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user