私はfloat値の配列、すなわちlifeを持っていますが、その中でCUDAの値が0より大きいエントリの数を数えたいと思います。 CPUオン配列からのカウント値CUDA
、コードは次のようになります。
int numParticles = 0;
for(int i = 0; i < MAX_PARTICLES; i++){
if(life[i]>0){
numParticles++;
}
}
を今CUDAに、私はこのようなものを試してみた:
__global__ void update(float* life, int* numParticles){
int idx = threadIdx.x + blockIdx.x * blockDim.x;
if (life[idx]>0){
(*numParticles)++;
}
}
//life is a filled device pointer
int launchCount(float* life)
{
int numParticles = 0;
int* numParticles_d = 0;
cudaMalloc((void**)&numParticles_d, sizeof(int));
update<<<MAX_PARTICLES/THREADS_PER_BLOCK,THREADS_PER_BLOCK>>>(life, numParticles_d);
cudaMemcpy(&numParticles, numParticles_d, sizeof(int), cudaMemcpyDeviceToHost);
std::cout << "numParticles: " << numParticles << std::endl;
}
をしかし、何らかの理由でCUDAの試みは常にリターンnumParticlesの場合は0です。どうして?
numParticles_dのメモリ割り当てコードが間違っていて、実行時にも問題が発生する可能性があることにも注意してください。 – talonmies
@talonmiesどのように割り当てコードが間違っていますか?どのように正しく行われますか? – Dynamitos
'numParticles_d'は、intではなくintへのポインタとして宣言する必要があります。 'sizeof(int)= sizeof(* int)'となるように32ビットシステム上で動作していても、うまく動作しない可能性があります。 – talonmies