3

我最近阅读了有关 OpenMP 的内容,并试图在我的程序中并行化一些现有的 for 循环以加快速度。但是,由于某种原因,我似乎将垃圾数据写入文件。我的意思是我没有将点 1、2、3、4 等写入我的文件,我有点 1、4、7、8 等。我怀疑这是因为我没有跟踪线程,它只会导致竞争条件?

我一直在阅读尽可能多的关于 OpenMP 的内容,因为它似乎是进行多线程编程的一个很好的抽象。我很感激任何指示,以了解我可能做错了什么。

这是我到目前为止一直在尝试做的事情(只有相关的代码):

#include <omp.h>

pixelIncrement = Image.rowinc/2;

#pragma omp parallel for
for (int i = 0; i < Image.nrows; i++ )
   {
      int k =0;
      row     = Image.data + i * pixelIncrement;

      #pragma omp parallel for
      for (int j = 0; j < Image.ncols; j++)
      {
          k++; 
          disparityThresholdValue = row[j];  
                 // Don't want to save certain points
             if ( disparityThresholdValue < threshHold)
             {       
                // Get the data points
                x = (int)Image.x[k]; 
                y = (int)Image.y[k]; 
                z = (int)Image.z[k]; 
                grayValue= (int)Image.gray[k];      

                cloudObject->points[k].x = x;
                cloudObject->points[k].y = y;
                cloudObject->points[k].z = z;
                cloudObject->points[k].grayValue = grayValue;

        fprintf( cloudPointsFile, "%f %f %f %d\n", x, y, z, grayValue);
             }
      }
   }

   fclose( pointFile );

我确实在我的编译器设置中启用了 OpenMP(C/C++ -> 语言 -> Open MP Support (/openmp)。

关于可能是什么问题的任何建议?我在 Windows XP 32 位上使用四核处理器。

4

3 回答 3

3

是否将所有点都写入文件,但不是按顺序写入,或者实际点数据是否混乱?

第一种情况在并行编程中是预期的——一旦你并排执行某些事情,你将无法保证顺序,除非你同步访问(此时你可以忽略并行化,因为它变得有效线性)。如果您需要依赖顺序,您可以并行化任何计算,但需要将其写在一个线程中。

如果点本身搞砸了,请检查变量的声明位置以及多个线程是否正在访问相同的变量。

于 2012-08-20T22:00:23.123 回答
3

这里有几个问题:

#pragma omp parallel for
for (int i = 0; i < Image.nrows; i++ )
   {
      int k =0;
      row     = Image.data + i * pixelIncrement;

      #pragma omp parallel for
      for (int j = 0; j < Image.ncols; j++)
      {
          k++; 

不需要内在的parallel for。外循环应该包含足够的工作来保持所有核心忙碌。

此外,for 内部循环k是一个共享变量,并且以非原子方式递增。x, y,z也在内部循环线程之间共享并“随机”覆盖。删除内部指令,看看它是如何进行的。

于 2012-08-21T05:31:12.080 回答
0

当您有一个带有嵌套循环的循环时,不需要第二个 omp pragma。它已经将第一个循环并行化。请记住,这仅在必须按顺序执行第二个循环时才有效。您有一个顺序递增,因此您不能以随机顺序执行第二个循环。OMP pragma 是并行化代码的一种非常简单而酷的方法,但不要过多地使用它们!

更多细节在这里 ->使用 OpenMP 的并行循环

于 2014-06-15T17:18:07.797 回答