【发布时间】:2012-08-20 21:53:40
【问题描述】:
我最近阅读了有关 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 支持 (/openmp)。
关于可能是什么问题的任何建议?我在 Windows XP 32 位上使用四核处理器。
【问题讨论】:
-
似乎您想在标题中添加“OpenMP”。
-
将
#omp atomic放在fprintf行的上方。您仍然无法以正确的顺序获取数据,但至少所有内容都应该在文件中。 -
Hristo,请您详细说明“至少所有内容都应该在文件中”是什么意思。 ?
-
我的意思是
fprintf不能保证是线程安全的,但在您的情况下,问题是在并行区域之外定义的所有变量都是默认共享的,您遇到了麻烦比赛条件。
标签: c multithreading visual-studio-2010 for-loop openmp