рассмотрим следующий код, где:
(i) Массивы a, b и c инициализируются
Код: Выделить всё
#pragma omp parallel num_threads(4)
{
#pragma omp for schedule(static, 64)
for(int i = 0; i < 256; i++)
{
d[i] = a[i];
if( i + 1 < 256 )
d[i+1] = b[i];
if( i + 2 < 256 )
d[i+2] = c[i];
}
}
(i) наблюдаются случайные результаты (правильные/неправильные)
(ii) неверные значения присваиваются 'd' по индексу i=64 или i=128
Учитывая количество назначенных потоков (4) и количество итераций (256 ), я применил Schedule(static, 64) с размером фрагмента 64. Я предполагаю, что статическое планирование заставит потоки выполняться последовательно. Я даже применил #pragma omp критическое к заданиям, но это не сработало, и случайное поведение сохранилось.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ver-for-lo