内部选定排序循环上的并行性会跳过一些数字

时间:2018-12-07 12:26:02

标签: c++ multithreading openmp

我正在尝试制作一个程序,您可以在其中设置所需的线程数量,它将选择选择排序算法与给定的数据和线程数量并行化。我知道在这种情况下,我应该只使用另一种算法,但这只是出于教育目的。因此,当在选择排序算法中并行化内部循环时,我遇到了一个问题,一些接近的数字没有进行排序,但是整个数组被内部的那几对数字分开,我找不到原因。

    int* selectionSort(int arr[], int size, int numberOfThreads)
{
    int i, j;
    int me, n, min_idx;
    bool canSwap = false;

#pragma omp parallel num_threads(numberOfThreads) private(i,j,me,n)
    {
        me = omp_get_thread_num();
        n = omp_get_num_threads();

        printf("Hello from %d/%d\n", me, n);


        for (i = 0; i < size - 1; i++) {
            min_idx = i;
            canSwap = true;
#pragma omp barrier

#pragma omp for
            for (j = i + 1; j < size; j++) {
                if (arr[j] < arr[min_idx])
                    min_idx = j;
                //printf("I am %d processing %d,%d\n", me, i, j);

            }

            printf("Min value %d ---- %d \n", arr[min_idx], min_idx);

#pragma omp critical(swap)
            if(canSwap)
            {
                swap(&arr[min_idx], &arr[i]);
                canSwap = false;
            }

#pragma omp barrier

        }
    }

    return arr;
}

1 个答案:

答案 0 :(得分:0)

我发现问题在于您无法真正并行化该算法(至少是在某种程度上),因为我正在将arr[j]arr[min_idx]进行比较, min_idx值有时可能会在特定时间更改,以至于其他线程将完成if (arr[j] < arr[min_idx])行,此后另一个线程将更改min_idx值,这有时会使刚刚完成的{{ 1}}的声明不再是if