尝试调试更大的应用程序我遇到了一个问题,我似乎无法将值从主机复制到设备。我在下面提供了一个最小的示例我认为应该将6
复制到设备然后再回来。
#include <stdio.h>
__device__ float a_d;
main(){
float a = 6.0;
float b;
puts(cudaGetErrorString(cudaMemcpy(&a_d,&a,sizeof(float),cudaMemcpyHostToDevice)));
puts(cudaGetErrorString(cudaMemcpy(&b,&a_d,sizeof(float),cudaMemcpyDeviceToHost)));
printf("%e",b);
}
我在64位Linux上使用CUDA 5.5获得以下输出。
$ nvcc test.cu -run
invalid argument
invalid argument
0.000000e+00
而我期待cudaSuccess
和6.000000e+00
。
答案 0 :(得分:2)
您不能将cudaMemcpy
直接用于__device__
个变量。 correct API to use为cudaMemcpyTo/FromSymbol
。
以下内容应该有效:
#include <stdio.h>
__device__ float a_d;
main(){
float a = 6.0;
float b;
puts(cudaGetErrorString(cudaMemcpyToSymbol(a_d,&a,sizeof(float)));
puts(cudaGetErrorString(cudaMemcpyFromSymbol(&b,a_d,sizeof(float)));
printf("%e",b);
}
不清楚为什么你期待0.000000e+00
。根据您的代码,我希望6.000000e+00
或类似的东西。