我有这样的情况:
#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[serial])的差异非常小。现在我知道我在这里犯了一个错误……尤其是循环之间的联系很明显。是否可以使用 omp 部分将其并行化?我尝试了一些选项,例如制作 shared(p) {这样做,我得到了正确的值,如串行形式},但当时没有加速。
任何关于通过大量 for 循环处理 openmp pragma 的一般建议对我来说也很棒!