我最近阅读了有关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++->语言->打开MP支持(/openmp)。

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

最佳答案

是否将所有点都写入文件,但不是顺序写入,还是将实际的点数据弄乱了?

第一种情况是在并行编程中预期的-并行执行某些操作后,除非同步访问,否则就无法保证顺序(此时,由于并行化实际上是线性的,因此您可以省略并行化)。如果需要依赖顺序,则可以并行化任何计算,但需要将其记录在一个线程中。

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

09-10 04:23
查看更多