写在前面
同学的程序遇到问题,主要是使用parallel for的双重循环,代码结果一直计算不对,但是一直没找到原因。后来发现原因挺简单的,就是在双重循环的时候,假如第一层是遍历 i,第二层是遍历 j,这个 j 如果是在omp_set_num_threads()之前声明的,就说明 j 被多个线程共用,那么可能这个线程正在使用 j,然后被另一个线程更改了。
omp parallel for
测试程序:
#include <omp.h>
#include <stdio.h>
using namespace std;
#define NUM_THREADS 2
int main()
{
int i;
printf("initila i address is %p\n", &i);
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for
for (i = 0; i < 10; ++i)
{
printf("thread is %d, i=%d, i address is %p\n",
omp_get_thread_num(), i, &i);
}
return 0;
}
在开辟线程之前声明了 i,执行程序,结果如下:
initila i address is 0x7ffc060c5034
thread is 0, i=0, i address is 0x7ffc060c4fc4
thread is 0, i=1, i address is 0x7ffc060c4fc4
thread is 0, i=2, i address is 0x7ffc060c4fc4
thread is 0, i=3, i addres

本文详细探讨了在使用OpenMP的parallelfor进行双重循环时,如何因线程共享变量导致的数据不一致问题。通过实例和解决方法,揭示了设置线程数前声明变量的影响,并介绍了如何利用collapse和private关键字避免数据冲突。
最低0.47元/天 解锁文章
4509

被折叠的 条评论
为什么被折叠?



