Каждый раз, когда у вас возникают проблемы с кодом CUDA, я настоятельно рекомендую вам использовать правильную проверку ошибок CUDA и запускать код с cuda-memcheck
, до , обращаясь к другим за помощью.Даже если вы не понимаете вывод ошибки, предоставление ее в вашем вопросе будет полезно для тех, кто пытается вам помочь.
Если бы вы сделали это, вы бы получили сообщение, которое выдает cudaMemcpyFromSymbol
ошибка неверного аргумента.
Если вы изучите документацию для этого вызова функции, вы увидите, что 4-й параметр не является параметром направления, а является параметром смещения.Таким образом, предоставление cudaMemcpyDeviceToHost
неверно для параметра смещения.Поскольку cudaMemcpyFromSymbol
всегда является передачей устройства -> хоста, предоставление аргумента направления является избыточным, и, поскольку он предоставляется по умолчанию, в этом нет необходимости.Ваш код работает правильно для меня, просто исключив:
$ cat t1414.cu
#include <stdio.h>
#include <cuda_runtime.h>
//__device__ int count[1] = {0};
__device__ int count = 0;
__global__ void inc() {
//count[0]++;
atomicAdd(&count, 1);
}
int main(void) {
inc<<<1,10>>>();
cudaDeviceSynchronize();
//int *c;
int c;
cudaMemcpyFromSymbol(&c, count, sizeof(int));
printf("%d\n", c);
return 0;
}
$ nvcc -o t1414 t1414.cu
$ cuda-memcheck ./t1414
========= CUDA-MEMCHECK
10
========= ERROR SUMMARY: 0 errors
$