CUDAで配列のすべての要素の合計を計算します。私はこのコードを思いついた。それはエラーなしでコンパイルされます。しかし、結果は常にゼロです。無効なデバイスシンボルはcudaMemcpyFromSymbol
です。スラストやクライブのようなライブラリは使えません。無効なデバイスシンボルcudaMemcpyFromSymbol CUDA
#define TRIALS_PER_THREAD 4096
#define NUM_BLOCKS 256
#define NUM_THREADS 256
double *dev;
__device__ volatile double pi_gpu = 0;
__global__ void ArraySum(double *array)
{
unsigned int tid = threadIdx.x + blockDim.x * blockIdx.x;
pi_gpu = pi_gpu + array[tid];
__syncthreads();
}
int main (int argc, char *argv[]) {
cudaMalloc((void **) &dev, NUM_BLOCKS * NUM_THREADS * sizeof(double));
double pi_gpu_h;
ArraySum<<<NUM_BLOCKS, NUM_THREADS>>>(dev);
cudaDeviceSynchronize();
cudaError err = cudaMemcpyFromSymbol(&pi_gpu_h, &pi_gpu, sizeof(double), cudaMemcpyDeviceToHost);
if(cudaSuccess != err)
{
fprintf(stderr, "cudaMemcpyFromSymbolfailed : %s\n", cudaGetErrorString(err));
exit(-1);
}
return pi_gpu_h; // this is always zero!!!
}
コードを正しくフォーマットするために30秒かかりましたら、皆さんに大きな助けになります。投稿されたものを読むのは信じられないほど困難です。 – talonmies