我正在尝试制作一个程序,您可以在其中设置所需的线程数量,它将选择选择排序算法与给定的数据和线程数量并行化。我知道在这种情况下,我应该只使用另一种算法,但这只是出于教育目的。因此,当在选择排序算法中并行化内部循环时,我遇到了一个问题,一些接近的数字没有进行排序,但是整个数组被内部的那几对数字分开,我找不到原因。
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;
}
答案 0 :(得分:0)
我发现问题在于您无法真正并行化该算法(至少是在某种程度上),因为我正在将arr[j]
与arr[min_idx]
进行比较,
min_idx
值有时可能会在特定时间更改,以至于其他线程将完成if (arr[j] < arr[min_idx])
行,此后另一个线程将更改min_idx
值,这有时会使刚刚完成的{{ 1}}的声明不再是if
。