私は次のような状況にあります:
#pragma omp parallel for private(i, j, k, val, p, l)
for (i = 0; i < num1; i++)
{
for (j = 0; j < num2; j++)
{
for (k = 0; k < num3; k++)
{
val = m[i + j*somenum + k*2]
if (val != 0)
for (l = start; l <= end; l++)
{
someFunctionThatWritesIntoGlobalArray((i + l), j, k, (someFunctionThatGetsValueFromAnotherArray((i + l), j, k) * val));
}
}
}
for (p = 0; p < num4; p++)
{
m[p] = 0;
}
}
読んでくれてありがとう、おい!シリアル実装に対して上記(3倍高速)を使用すると、結果にごくわずかな違い(0.999967[omp]と1[シリアル])が異なることに気づきました。今、私はここで間違いをしていることを知っています...特にループ間の関係は明らかです。ompセクションを使用してこれを並列化することは可能ですか?shared(p)を作成するなどのいくつかのオプションを試しましたが、{これを行うと、シリアル形式のように正しい値が得られました}が、そのときは高速化されませんでした。
多数のforループでopenmpプラグマを処理するための一般的なアドバイスも、私にとっては素晴らしいことです。