2012-02-15 64 views
0

在这个快速排队实现中,我认为我正在运行的程序进入了一个我无法理解的起跑条件。所以我把自己转到SO社区寻求指导。用C编写的quicksort赛车条件与OpenMP并行

如果我在quicksort()的for-loop之前删除了“#pragma omp parallel for private(i)”,那么它会正确排序。

下面是一个排序示例和代码。

Unsorted 
3 6 7 5 3 5 6 2 9 1 

Sorted 
0 1 2 3 3 5 6 7 9 5 



    size_t average (size_t a, size_t b) 
    { 
      return (a + b)/2; 
    } 

    void swap (int *array, size_t x, size_t y) 
    { 
      int tmp; 
      tmp = array[x]; 
      array[x] = array[y]; 
      array[y] = tmp; 
    } 

    void quicksort (int *array, int left, int right) 
    { 
      int i, last; 

      if (left >= right) 
      { 
        return; 
      } 

      swap (array, left, average(left, right)); 
      last = left; 

      #pragma omp parallel for private(i) 
      for (i = left + 1; i <= right; i++) 
      { 
        if (array[i] < array[left]) 
        { 
          #pragma omp critical 
          { 
            last++; 
          } 
          swap(array, last, i); 
        } 
      } 

      swap (array, left, last); 

      #pragma omp parallel sections 
      { 
        #pragma omp section 
        { 
          quicksort(array,left,last-1); 
        } 

        #pragma omp section 
        { 
          quicksort (array, last+1, right); 
        } 
      } 
    } 

回答

3

您在该循环中执行的交换操作深深依赖于对方。在这里,没有办法获得并行性。

但是,对于使用两个并行部分开发的分支并行性,这不是必需的。你有这方面的性能问题吗?

0

当我尝试多线程时,我通常会将quicksort分解为它的子类。这样每个交换操作都独立于所有其他操作。它看起来像交换操作是你的实现问题。

我不知道你是否能够使用堆栈来存储需要排序的子范围,但是我发现它对我的实现来说效果最好。我正在运行双核8核心工作站,并使用openmp。除了前几个步骤外,16个内核都是100%。