Сортировка массива в openmp — критический раздел

Очень похоже на этот вопрос Сортировка массива в openmp, который имеет несколько сотен просмотров, но не правильный отвечать. Поэтому я еще раз попробую спросить здесь снова. Я знаю о накладных расходах и бесполезности этого в отношении ускорения или производительности. Это просто небольшой пример для работы с openMP. Тот факт, что это insertSort, дан моим инструктором курса.

Вот мой код:

std::vector<int> insertionSort(std::vector<int> a) {
    int i, j, k;
    #pragma omp parallel for private(i,j,k)
    for(i = 0; i < a.size(); i++) {
    #pragma omp critical
        k = a[i];
        for (j = i; j > 0 && a[j-1] > k; j--)

        #pragma omp critical
        {
            a[j] = a[j-1];
            a[j] = k;
        }
    }
 return a;
 }

Я понимаю, что критическим аспектом является состояние гонки между потоками, получающими доступ (чтение и запись) к элементам a, поэтому я помещаю критический раздел вокруг них. Кажется, этого недостаточно. Что мне здесь не хватает. Без прагм сортировка правильная.


person Simeon    schedule 14.01.2015    source источник
comment
Как я ответил на вопрос, на который вы ссылались, сортировка вставками по своей сути является последовательной, итерации внешнего цикла не могут выполняться не по порядку. Добавления критических разделов недостаточно.   -  person Alexey Kukanov    schedule 15.01.2015
comment
Другой похожий вопрос: stackoverflow.com/questions/13905410/insertion-sort- в openmp   -  person Alexey Kukanov    schedule 15.01.2015