OpenMP 单线程改多线程结果出错

今天踩了一个很大的坑,觉得很有必要记录下来。最近都在弄高性能方面的,CPU跟GPU的并行计算我都有在学。


今天这个坑是关于OpenMP的。初始程序用1个线程跑一点问题都没有,改为Openmp的多线程后,每个pixel的计算结果有的对有的不对,有的还没有被计算。由于我是移植程序的,代码基本一模一样,可这一模一样好像说的也不对,被吐槽过几次,很多看上去一样的代码其实总有一两个小地方是不一样的,所以对比代码的时候一定要细心认真。因此我跟原来的程序认真一步一步debug进行中间结果的对比,发现同样的代码居然会有不同的结果,有的地方我明明给数组A赋值了,tid == 0 的时候一切正常, tid == 1的时候就都算错。

这个坑也不知道怎么去搜索,因此取了这个题目 OpenMP 单线程改为多线程出错,希望有日后的人踩到这个坑的时候能很快地跳出来。首先要查的内容方面应该是Openmp变量共享的问题,多线程肯定是资源共享的,但tid ==0的时候一切正常, tid==1,2,3的时候总是报错,这就像是tid == 0占有了这个公共资源,其他线程获取不到。又或者说是某些线程擅自修改了某些变量,然而我的代码里面根本就没有相关的写入操作,最后发现原来是:

#pragma omp for

         for(i = 0, i < n;i++)


这样的写法是错误的,在openmp for语句中一定要声明好这个变量的作用域,上述的写法i是公用变量,也就是说pragma omp for确实是分配给多个线程等量的任务,然而由于每个线程都对i进行i++的这个操作,有些i的变量就被跳过了,所以就出现了没有计算结果的这种情况。

正确的写法应该是:

#pragma omp for

         for(int i = 0, i < n;i++)


一定要有int 这种类型的声明。这个坑踩了整整一天。。。。。。。。一模一样的代码居然还能跑出不一样的结果,我们还是要了解程序的本质或者说用到的技术的本质才能更好地发现出问题的本质啊。

你可能感兴趣的:(OpenMP 单线程改多线程结果出错)