我被指派实现一个不使用reduction子句的约简变量的想法。我设置了这个基本代码来测试它。
int i = 0;
int n = 100000000;
double sum = 0.0;
double val = 0.0;
for (int i = 0; i < n; ++i)
{
val += 1;
}
sum += val;
最终会有sum == n
。
每个线程都应该将val
设置为私有变量,然后将其加入到sum
中应该成为一个关键的部分,这是所有线程汇合的地方,例如:
int i = 0;
int n = 100000000;
double sum = 0.0;
double val = 0.0;
#pragma omp parallel for private(i, val) shared(n) num_threads(nthreads)
for (int i = 0; i < n; ++i)
{
val += 1;
}
#pragma omp critical
{
sum += val;
}
我无法弄清如何维护关键部分的私有val实例。我尝试将整个内容包含在较大的pragma中,例如:
int i = 0;
int n = 100000000;
double sum = 0.0;
double val = 0.0;
#pragma omp parallel private(val) shared(sum)
{
#pragma omp parallel for private(i) shared(n) num_threads(nthreads)
for (int i = 0; i < n; ++i)
{
val += 1;
}
#pragma omp critical
{
sum += val;
}
}
但我没有得到正确的答案。我应该如何设置指示符和子句来实现这一点?
nthreads
的数组,并将其添加到array[omp_get_thread_num()]
,然后计算数组中所有值的总和。这样更加直观易懂;-) - stefan