我最近阅读了有关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处理器。
最佳答案
是否将所有点都写入文件,但不是顺序写入,还是将实际的点数据弄乱了?
第一种情况是在并行编程中预期的-并行执行某些操作后,除非同步访问,否则就无法保证顺序(此时,由于并行化实际上是线性的,因此您可以省略并行化)。如果需要依赖顺序,则可以并行化任何计算,但需要将其记录在一个线程中。
如果这些点本身搞砸了,请检查变量的声明位置,以及是否有多个线程正在访问同一变量。