为什么我在i
和main
中有foo
的不同值?
以下是我的示例代码:
#include<stdio.h>
#include<omp.h>
double a;
int i;
int j;
int nr_threads;
void foo()
{
printf("foo::i: \t%d\n", i);
}
int main()
{
puts("hejka");
a = 0;
nr_threads = omp_get_num_threads();
printf("Threads: %d\n", nr_threads);
omp_set_num_threads(7);
#pragma omp parallel private(i,j) shared(a)
{
#pragma omp single
{
nr_threads = omp_get_num_threads();
printf("Threads: %d\n", nr_threads);
}
#pragma omp for reduction(+:a)
for(i=0;i<10;i++)
{
printf("main::i:\t%d\n", i);
foo();
}
}
printf("a: %lf\n",a);
printf("i: %d\n",i);
printf("j: %d\n",j);
return 0;
}
答案 0 :(得分:0)
您需要在并行部分内初始化i
。
我认为'copyin'#pragma
(或类似的东西)可用于在启动并行部分时将值克隆到每个线程中。
未初始化线程私有变量。
如果内存服务,则默认构造thread = private类对象。
答案 1 :(得分:0)
问题是parallel for
的循环变量隐式地为每个工作线程设置为私有,因此每个线程将获得一个私有变量i
。除了名称之外,工作线程看到的i
与主线程看到的i
之间没有任何关联。