我有一個情況,如:平行的OMP內分隔部爲:OpenMP的
#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 [1]與[串行])的差別很小。現在我知道我在這裏犯了一個錯誤......特別是循環之間的連接是顯而易見的。 是否可以使用omp部分對其進行並行化?我嘗試了一些選項,如共享(p){這樣做,我得到正確的值,如在串行形式},但沒有加速。
任何關於在for循環中處理openmp編譯指示的一般建議對我來說也是非常棒的!
這很難讀。它有什麼作用?某種張量收縮?你能給數學公式嗎? – Anycorn 2010-04-21 02:34:55
這是一個程序的一部分,它執行線性分離的內核卷積。我會編輯它,讓它看起來更好。 – 2010-04-21 04:45:31
'm'的目的是什麼?你的功能是否修改它?最內層的函數是否寫入相同的內存位置? 沒有足夠的信息來提出有意義的建議。 您需要確定可能的競爭條件。 – Anycorn 2010-04-21 05:23:15