2016-05-15 10 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とXeonでは動作しません。

私はそれをより速くし、すべてのマシンで適切に動作させるために何ができるか教えてください。

+3

コードがフォーマットされておらず、中カッコのバランスが取れていないことを誰が知っているか。 –

+0

コードを貼り付ける際に謝罪しましたが、今では変更しました。見てみてください。 –

答えて

1

並列ソートは非常に基本的なアルゴリズムです。ほぼすべての並列コンピューティングプラットフォームには、ソートAPI /サンプルコードがあります。

ここにその一部を示します。 GPU上のGPU/CPU http://docs.nvidia.com/cuda/thrust/#sorting

CUBソート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

https://nvlabs.github.io/cub/

現代のGPUのソートに

スラストソート

Xeon PhiでのOpenCLソート https://software.intel.com/en-us/articles/bitonic-sorting

すべてのドキュメントとコードがあります。

+0

素敵な要約、ありがとう! –

+0

助けてくれてありがとうございますが、実際に私はすでにこれらのリンクをすべてチェックしています。私の教授は1回目の再帰呼び出しの前に#pragma omp singleを望んでいますが、GPUとXeonプロセッサではうまく動作しませんそれを改善すると言っているが、私はほとんどすべてのリンクをチェックして、それを改善するものは何も見つかりませんでした。 –

+0

@PragyaSharma GPUとXeon Phiで動作するコードは、OpenMPコードとはまったく異なります。 1行か2行の変更でGPU上でコードを実行することはありません。基本的には、各コンピューティングプラットフォームごとに別々のコードを記述する必要があります。 – kangshiyin

関連する問題