私は配列の中で最大の要素を見つけるcudaのreduceを実装しようとしています。私は最小値を見つけるためにこのカーネルを使いました。それはうまく動作しますが、最大値を見つけようとするとうまくいきません。私はアルゴリズムを何度も繰り返してきたので、バグを見つけることができません。どんな助けでも本当に感謝しています。 (私はそこにprint文のコメントを解除する場合に加えて、私は....もかなり頭痛である、異なる出力を得る)CUDAの削減を実装する際の問題
__global__
void findMaxAndMin(const float* const d_logLuminance, float* reduceCopy, int length, float* min_logLum, float* max_logLum){
int idx = threadIdx.x + blockDim.x*blockIdx.x;
if(idx >= length){
return;
}
reduceCopy[idx] = d_logLuminance[idx];
__syncthreads();
//do a reduction with max
for(int offset = 1;offset < length;offset = offset*2){
if(idx % (offset*2) == 0){
int compIdx = idx + offset;
if(compIdx < length){
float newVal = a_max(reduceCopy[idx], reduceCopy[compIdx]);
if(idx == 0){
//printf("val %f \n", newVal);
}
__syncthreads();
reduceCopy[idx] = newVal;
__syncthreads();
}
}
__syncthreads();
}
__syncthreads();
if(idx == 0){
*max_logLum = reduceCopy[0];
}
}
ありがとう、私はこのクーダの特定の動作のいくつかを知らなかった...私はこれを再実装しようとします。ありがとうございました! –