У меня ситуация типа:
#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;
}
}
Спасибо за прочтение, фу! Что ж, я заметил очень небольшую разницу в результатах (0,999967[omp] против 1[serial]), когда я использую вышеуказанное (что в 3 раза быстрее) по сравнению с последовательной реализацией. Теперь я знаю, что делаю здесь ошибку... особенно очевидна связь между петлями. Можно ли распараллелить это, используя разделы omp? Я пробовал некоторые варианты, например, сделать shared(p) {сделав это, я получил правильные значения, как в последовательной форме}, но тогда никакого ускорения не было.
Любой общий совет по работе с прагмами openmp по множеству циклов for также был бы полезен для меня!
m
? Ваша функция изменяет его? самая внутренняя функция когда-либо записывает в одну и ту же ячейку памяти? недостаточно информации, чтобы сделать осмысленное предложение. Вам необходимо определить возможные условия гонки. - person Anycorn   schedule 21.04.2010