feat(omp): add lab omp realised during classroom

This commit is contained in:
2025-10-18 16:36:29 +02:00
parent 9d707a253a
commit f8ae49d666
6 changed files with 74 additions and 19 deletions

View File

@@ -34,14 +34,14 @@ bool isPiSequentiel_OK(int n)
\*-------------------------------------*/
double piSequentiel(int n) {
const double delta_x = 1 / (double)n;
const double dx = 1.0 / (double)n;
double sum = 0;
for (int i = 0; i < n; i++) {
double xi = i * delta_x;
double xi = i * dx;
sum += fpi(xi);
}
return sum * delta_x;
return sum * dx;
}
/*----------------------------------------------------------------------*\

View File

@@ -45,22 +45,20 @@ double piOMPEntrelacerPromotionTab(int n)
double sum[NB_THREAD];
// Reduction intra thread
#pragma omp parallel
{
#pragma omp parallel {
const int TID = Omps::getTid();
int s = TID;
double sum_thread = 0;
while (s < n)
{
double xi = s * delta_x;
sum_thread += fpi(xi);
s += NB_THREAD;
while (s < n) {
double xi = s * delta_x;
sum_thread += fpi(xi);
s += NB_THREAD;
}
sum[TID] = sum_thread;
}
}
double sumTotal = 0;

View File

@@ -37,8 +37,29 @@ bool isPiOMPEntrelacerCritical_Ok(int n)
double piOMPEntrelacerCritical(int n)
{
//TODO
return -1;
const double dx = 1.0 / (double)n;
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;
}
/*----------------------------------------------------------------------*\

View File

@@ -40,8 +40,26 @@ bool isPiOMPEntrelacerAtomic_Ok(int n)
*/
double piOMPEntrelacerAtomic(int n)
{
// TODO
return -1;
const double dx = 1.0 / (double)n;
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;
}
/*----------------------------------------------------------------------*\

View File

@@ -43,7 +43,18 @@ bool isPiOMPforPromotionTab_Ok(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;
}

View File

@@ -41,11 +41,18 @@ bool isPiOMPforReduction_Ok(int n)
*/
double piOMPforReduction(int n)
{
//TODO
return -1;
const double dx = 1.0 / (double)n;
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 *|
\*---------------------------------------------------------------------*/