2016-10-19 3 views
2

私はOpenCLには非常に新しいです(今日開始)。私は次のような方法で配列の番号を追加するためのカーネルコードを実現するのに苦労している: A [] = [1,2,3,4,5,6,7,8,9,10]、合計はsum [] = [4,10,16]でなければなりません。OpenClカーネルコード

i.e, sum[i]=A[i]+A[i+2]; 
    i=i+3; 

私は次のコードを試しましたが、動作しないようです。

std::string kernel_code = 
     " void kernel simple_add(global const int* A, global const int* B, global int* C){ " 
     " int x =0;" 
     " int i =get_global_id(0);" 
     " SUM[x]=A[i]+A[i+2];" 
     " i=i+3; 
     " x++;" 
     " } "; 

私はこれを行う方法ではないことを確信しています。この点に関する提言は高く評価されるだろう。

答えて

1

iを、集合内の唯一のものとして計算する必要があります。 gidは作業項目のグローバルIDです。その3倍は必要です。また、gidやiを使用した後は変更する必要はありません。これは最適ではありませんが、正しい答えが得られます。

void kernel simple_add(global const int* A, global const int* SUM){ 
    int gid = get_global_id(0); 
    int i = gid * 3; 
    SUM[gid]=A[i]+A[i+2]; 
} 
+0

ありがとうございます!コードによって正しい結果が得られます。少し読んだ後で、私は作業項目のグローバルIDを明示的に変更する必要がないことに気付きました。ご協力ありがとうございました :) – Ijjz