【发布时间】:2018-11-11 01:01:42
【问题描述】:
我正在学习关于 OpenMP 的 this 教程,我在第 19 页遇到了这个练习。这是一个我必须并行化的 pi 计算算法:
static long num_steps = 100000;
double step;
void main ()
{
int i;
double x, pi
double sum = 0.0;
step = 1.0 / (double)num_steps;
for(i = 0; i < num_steps; i++)
{
x = (I + 0.5) * step;
sum = sum + 4.0 / (1.0 + x*x);
}
pi = step * sum;
}
到目前为止,我无法使用#pragma parallel for。我只能使用:
#pragma omp parallel {}
omp_get_thread_num();
omp_set_num_threads(int);
omp_get_num_threads();
我的实现如下所示:
#define NUM_STEPS 800
int main(int argc, char **argv)
{
int num_steps = NUM_STEPS;
int i;
double x;
double pi;
double step = 1.0 / (double)num_steps;
double sum[num_steps];
for(i = 0; i < num_steps; i++)
{
sum[i] = 0;
}
omp_set_num_threads(num_steps);
#pragma omp parallel
{
x = (omp_get_thread_num() + 0.5) * step;
sum[omp_get_thread_num()] += 4.0 / (1.0 + x * x);
}
double totalSum = 0;
for(i = 0; i < num_steps; i++)
{
totalSum += sum[i];
}
pi = step * totalSum;
printf("Pi: %.5f", pi);
}
通过使用 sum 数组忽略问题(稍后解释它需要使用 #pragma omp critical 或 #pragma omp atomic 为 sum 值定义临界区),上述实施仅适用于有限数量的线程(在我的情况下为 800),其中串行代码使用 100000 步。有没有办法只使用前面提到的 OpenMP 命令来实现这一点,还是我必须使用 #pragma omp parallel for,这在教程中还没有提到?
非常感谢您抽出宝贵时间,我真的很想通过 OpenMP 掌握 C 语言中的并行化概念。
【问题讨论】:
-
你可以使用
#pragma omp atomic吗? -
@IncreasinglyIdiotic 后面会解释#pragma omp atomic 的用处,但仅涉及和值。如何使用它来解决“线程过多”的问题?有没有办法,不用parallel for?
-
本教程定期将困惑的学习者发送到 StackOverflow。我建议您寻找遵循更惯用的高级方法的学习材料,而不是自下而上地解释 OpenMP。如果您正在参加现场研讨会,也许它会起作用,但在在线阅读/观看材料时肯定不会。
-
@Zulan [ad]Stackoverflow:自 2008 年以来将混乱转化为知识:-D[/ad]
标签: c parallel-processing openmp