Проблема с распараллеливанием цикла в OpenMP

Рейтинг: 0Ответов: 1Опубликовано: 01.04.2011

Допустим, есть вектор odds, который хранит количество чётных и нечётных чисел, и есть вектор numbers, который хранит сами эти числа.

Цикл, распараллеливаемый OpenMP:

#pragma omp parallel for
for (int i = 0; i < numbers.size(); ++i)
{
    ++(odds[numbers[i] % 2]);
}

Последовательная и параллельная версии этого цикла дают разный результат. Где баг?

Ответы

▲ 2

С атомарным доступом конечно, можно, но смысл? Он жутко замедлит работу и эффект распараллеливания просто не будет заметен.

Я бы написал так

int uneven = 0, even = 0;
#pragma omp parallel for reduction (+:uneven) reduction (+:even)
for (i = 0; i < numbers.size(); i++) {
    (a[i]%2) ? (uneven++) : (even++);    
}    
odd[0] = even;
odd[1] = uneven;

Код, может, несколько корявый , но, мне кажется, намного эффективнее будет работать.