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,22 +45,20 @@ 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;
|
||||||
}
|
}
|
||||||
sum[TID] = sum_thread;
|
sum[TID] = sum_thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
double sumTotal = 0;
|
double sumTotal = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -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