int i = 0;
int total = 0;
#pragma omp parallel
{
int iID = omp_get_thread_num();
printf("1.I am Thread %d\n", omp_get_thread_num());
#pragma omp for
for (i = 0; i < 20000; i++)
{
total += i;
int iID = omp_get_thread_num();
printf("2.I am Thread %d\n", omp_get_thread_num());
}
}
std::cout << "OpenMP total:" << total<< std::endl;
上面的代码计算得到的total结果是正确的(重复跑过多次),并且for循环也是多线程跑的,我的问题是在total+=i的时候,我不需要用原子或者临界区去控制吗?
#pragma omp for
放在了循环的开头,编译器会自动处理同步。
这里total没必要进行原子控制,加20000中任意一个数,先加和后加是一样的。