Ваш for
l oop не может (или не должен ) быть распараллелен, потому что переменная, объявленная вне его области (tmp
), изменяется внутри. В вашем случае эту конкретную проблему можно исправить, удалив текущее объявление, которое у вас есть для tmp
, и поместив его в блок if
:
if (array[j] > array[j + 1])
{
unsigned int tmp = array[j]; // Now a LOCAL variable (one for each loop).
array[j] = array[j + 1];
array[j + 1] = tmp;
no_swap = 0;
}
В вашем коде как это стоит, существует (высокая) вероятность гонки данных, если циклы, выполняющиеся параллельно, пытаются одновременно прочитать или записать single tmp
переменную.
Однако у вас также есть похожая проблема с переменной no_swap
и, что более важно, с самими данными array
: если один l oop s j
совпадает с другим l oop s j + 1
, то попытка замена элементов вызовет гонку данных (конфликт доступа).
Подводя итог: распараллеливание пузырьковой сортировки нецелесообразно, если вы не создадите гораздо более сложный код. Например, см. Здесь .