2016-04-05 16 views
-3

私はOpenCLの初心者です。私はOpenCLアプリケーションを実装しようとしています。私は疑問を持っています。openclカーネルコードです。私はオリジナルのcコードを与えました。カーネル側でネストループを書く方法OpenCL

質問: - openclカーネルコードにその与えられたCのコードを変更するために私を助けて?。

ORIGINAL Cコード:

int i, j; 

// initialization of indexes 
for (i = 0; i<n; i++) 
    Index[i] = i; 

// Bubble sort 
for (i = 0; i<n - 1; i++) 
{ 
    for (j = i + 1; j<n; j++) 
    { 
     if (I[i] > I[j]) 
     { 
      double z = I[i]; // exchange attractiveness 
      I[i] = I[j]; 
      I[j] = z; 
      z = f[i];   // exchange fitness 
      f[i] = f[j]; 
      f[j] = z; 
      int k = Index[i]; // exchange indexes 
      Index[i] = Index[j]; 
      Index[j] = k; 
     } 
    } 
} 
+0

それなります"if"部分のみを変更して並列化した後、奇数 - 偶数のソートを行います。 –

+0

また、あなたの 'OpenCL'コードドラフトを貼り付けて、それに何が間違っているのか、あるいはあなたが問題になっている部分をオプションで伝えてください。 –

答えて

1

例4096のための素子アレイ(代替bubble1とbubble2少なくとも2048倍---> 4096(N)カーネルの実行):INITに

インデックスホスト側はその割り当てからです。 補助機能:

void swap2p(__private int * I,int i,int j) 
{ 
     int tmp=I[i]; 
     I[i]=I[j]; 
     I[j]=tmp; 
} 
void swap2g(__global int * I,int i,int j) 
{ 
     int tmp=I[i]; 
     I[i]=I[j]; 
     I[j]=tmp; 
} 

交互カーネル-1:

__kernel void bubble1(__global int * I, __global int * f, __global int * Index){ 
     int threadId=get_global_id(0); 
     __private int vals[2]; 

     if(threadId*2+1<4096) 
     { 
       vals[0]=I[threadId*2]; 
       vals[1]=I[threadId*2+1]; 
       if(vals[0]>vals[1]) 
       {  
        swap2p(vals,threadId*2,threadId*2+1); 
        swap2g(f,threadId*2,threadId*2+1); 
        swap2g(Index,threadId*2,threadId*2+1); 
        I[threadId*2]=vals[0]; 
        I[threadId*2+1]=vals[1]; 
       } 
     } 
} 

交流カーネル-2:

__kernel void bubble2(__global int * I){ 
     int threadId=get_global_id(0); 
     __private int vals[2]; 

     if(threadId*2+2<4096) 
     { 
       vals[0]=I[threadId*2+1]; 
       vals[1]=I[threadId*2+2]; 
       if(vals[0]>vals[1]) 
       {  
        swap2p(vals,threadId*2+1,threadId*2+2); 
        swap2g(f,threadId*2+1,threadId*2+2); 
        swap2g(Index,threadId*2+1,threadId*2+2); 
        I[threadId*2+1]=vals[0]; 
        I[threadId*2+2]=vals[1]; 
       } 
     } 
} 

グローバルスレッド数:N/2(2048)

+0

グローバルメモリに3XORを実行するのが最適ですか?一時変数に格納するだけの方がいいですか? – DarkZeros

+0

さて、バブルソートはとにかくかなり悪いです:P。私はあなたの解決策は大丈夫だと思いますが、スワップはスワップやXORの方がいいと思っています.... – DarkZeros

+0

あなたはそうです、それはvramにもっと50%のアクセス権を持っています。今はtmpを使って4回のアクセスです。 "if"部分にも同じ変数が必要です。 –

関連する問題