2016-05-15 37 views
1
void pmergesort(int a[], int l, int r) 
{ 
    if (l < r) 
     { 
     int m = l+(r-l)/2; 
     #pragma omp parallel 
      { 
       #pragma omp single 
       { 
        #pragma omp task 
        pmergesort(a, l, m); 
       } 
      #pragma omp task 
      pmergesort(a, m+1, r); 
      #pragma omp taskwait 
      pmerge(a,l,m,r); 
     } 
    } 
} 

我的教授告訴我只在第一次遞歸調用之前使用#pragma omp single,以使程序更快。它在我的筆記本電腦上運行速度非常快,但它不能在GPU和Xeon phi上正確排序,因爲這些機器具有更多並行線程。並行合併排序工作在筆記本電腦上,但不是在GPU和至強phi

請讓我知道我能做些什麼來使它在所有機器上更快速和正常工作。

+3

誰知道你的意思,因爲代碼沒有格式化,大括號不平衡。 –

+0

在發生的代碼粘貼過程中,我已經改變了它,請看一看,如果您有任何想法,請告訴我。 –

回答

1

並行排序是非常基本的算法。幾乎每個並行計算平臺都有排序的API /示例代碼。

這裏有一些。在GPU上GPU

推力排序/ CPU http://docs.nvidia.com/cuda/thrust/#sorting

CUB排序 https://nvlabs.github.io/cub/

在GPU現代GPU排序 https://nvlabs.github.io/moderngpu/

TBB/OpenMP的/ Cilk的加樣的CPU https://software.intel.com/en-us/articles/a-parallel-stable-sort-using-c11-for-tbb-cilk-plus-and-openmp

OpenCL排序至強Phi https://software.intel.com/en-us/articles/bitonic-sorting

文檔和代碼都在那裏。

+0

好的總結,謝謝! –

+0

感謝您的幫助,但是,實際上我已經檢查了所有這些鏈接,我的教授希望在第一次遞歸調用之前使用#pragma omp single,當我這樣做時,它在GPU和Xeon處理器上工作不正常,所以他正在說要改進它,但我已經檢查了幾乎所有的鏈接,並沒有發現任何改進它。 –

+0

@PragyaSharma在GPU和Xeon Phi上運行的代碼與OpenMP代碼完全不同。您的代碼不可能在一條或兩條修改線上運行在GPU上。基本上你必須爲每個計算平臺編寫一個單獨的代碼。 – kangshiyin

相關問題