私は最近OpenMPについて読んでいて、スピードアップを得るためにプログラム内の既存のforループのいくつかを並列化しようとしていました。しかし、どういうわけか、ファイルにガベージデータが書き込まれているようです。つまり、ファイルにポイント1、2、3、4などが書き込まれておらず、ポイント1、4、7、8などがあります。これは、ポイント1、2、3、4などを追跡していないためだと思われます。スレッドとそれは競合状態につながるだけですか?
マルチスレッドプログラミングを行うことは素晴らしい抽象化のように思われるので、私は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 );
コンパイラー設定(C /C++->言語->OpenMPサポート(/ openmp))でOpenMPを有効にしました。
何が問題になるのかについて何か提案はありますか?WindowsXP32ビットでクアッドコアプロセッサを使用しています。