2016-03-29 16 views
1

私はgpuに共有メモリがないので、グローバルメモリのgpuに並列リダクション合計を書いています(ローカルメモリを使用できないと思います)。 問題は、私が入力した数字の数に応じて数百から数百の間違った解を出力し始める1024 * 4の数より多くの数を追加しようとすると問題になります。理由は何でしょうか? Aは入力、Cは出力です。gpuのパラレルリダクション合計が間違ったopenclを計算する

__kernel void GMM(__global float *A, __global float *B, __global float *C) 
{ 
uint global_id =get_global_id(0); 
uint group_size=get_global_size(0); 

B[global_id]=A[global_id]; 
for(int stride = group_size/2;stride>0;stride /=2) 
{ 
    if(global_id<stride) 
    { 
     B[global_id]+=B[global_id+stride]; 
    } 
} 
if(global_id == 0) 
C[get_group_id(0)]=B[0]; 
} 
+0

予定しているワークグループの数とワークグループのサイズは? – doqtor

+0

私は2048のワークグループのように、1024 * 4のグローバルサイズと2のローカルサイズを持っています。 – Fluffy

+0

私はいくつかの種類の上限に入り、1024 * 4のグローバルサイズを超えたときにすでに追加されているランダムなグローバル値を追加することになりますか? – Fluffy

答えて

0

明らかに私は共有メモリを持っています。そして、__localのメモリとローカルな障壁を使うことで、ソリューションは一貫性があり正しいものになりました!

関連する問題