我有一些工作代码...我分配一个设备变量指针,如下所示:
float *d_var;
cudaMalloc(&d_var, sizeof(float) );
稍后在我的代码中,我想将此变量的内容复制到本地变量(引用):
checkCudaErrors(cudaMemcpy(&h_var, &d_var, sizeof(float), cudaMemcpyDeviceToHost));
效果很好!但使用cudaMalloc
慢!
所以我想在不使用 cudaMalloc
的情况下使用 __device__
定义来分配变量:
__device__ float d_var = 1000000000.0f;
这非常有效,我知道这种情况下的 d_var 已正确初始化,我可以像以前一样用它完成所有工作。我一直在打印它的内容,所以我知道它的内容是正确的。但是当我尝试使用与以前相同的代码将内容复制到我的主机变量时:
checkCudaErrors(cudaMemcpy(&h_var, &d_var, sizeof(float), cudaMemcpyDeviceToHost));
我收到一个非常模糊的错误:
invalid argument cudaMemcpy(&h_var, &d_var, sizeof(float), cudaMemcpyDeviceToHost)
我尝试将变量引用为 &d_var
、d_var
、*d_var
但无济于事。
非常感谢任何帮助。
谢谢!
最佳答案
哎呀,我明白了......
我需要使用 cudaMemcpyFromSymbol(); 而不是调用
cudaMemcpy();
checkCudaErrors(cudaMemcpyFromSymbol(&h_var, d_var, sizeof(float), 0, cudaMemcpyDeviceToHost));
关于c++ - 如何 cudaMemcpy __device__ 初始化的 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501223/