cudaMemcpyToSymbol的问题
我正试图复制到恒定的内存中。但是我不能,因为我对cudaMemcpyToSymbol函数的用法有误解。我正试着跟着 这里有一些代码cudaMemcpyToSymbol的问题,cuda,nvidia,Cuda,Nvidia,我正试图复制到恒定的内存中。但是我不能,因为我对cudaMemcpyToSymbol函数的用法有误解。我正试着跟着 这里有一些代码 __device__ __constant__ double var1; __device__ __constant__ int var2; int main(){ //... some code here... double var1ToCopy = 10.1; int var2ToCopy = 1; void * p1 = &a
__device__ __constant__ double var1;
__device__ __constant__ int var2;
int main(){
//... some code here...
double var1ToCopy = 10.1;
int var2ToCopy = 1;
void * p1 = &var1ToCopy;
void * p2 = &var2ToCopy;
cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess){
return -1;
}
cudaStatus = cudaMemcpyToSymbol((void*)&var2,p2,sizeof(int),0,cudaMemcpyHostToDevice);
if (cudaStatus != cudaSuccess){
return -1;
}
//... and some code here...
}
我知道这是一个非常愚蠢的问题,但我已经花了几个小时在谷歌上搜索答案,但没有任何成功。您不需要在符号名称上添加符号。符号与指针或变量不同 与此相反:
cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);
这样做:
cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));
我还简化了上面的调用,因为一些参数具有默认值,如中所示
下面是一个关于代码修改版本的完整示例(需要cc2.0+GPU):
$cat t626.cu
#包括
__装置常数双变量1;
__设备;
__全局无效内核(){
printf(“%f\n”,var1);
printf(“%d\n”,var2);
}
int main(){
双var1ToCopy=10.1;
int var2ToCopy=1;
cudaError_t cudaStatus=cudaMemcpyToSymbol(var1和var1ToCopy,sizeof(double));
如果(cudaStatus!=cudaSuccess){printf(“fail1\n”);返回1;}
cudaStatus=cudaMemcpyToSymbol(var2和var2ToCopy,sizeof(int));
if(cudaStatus!=cudaSuccess){printf(“fail2\n”);返回1;}
内核();
cudaDeviceSynchronize();
返回0;
}
$nvcc-arch=sm_20-o t626 t626.cu
美元/t626
10.100000
1.
$
答案清晰而精彩。非常感谢。顺便说一句,我试过cudaStatus=cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double))代码>但VisualStudio在它下面加了红线。它把我弄糊涂了,所以我并没有尝试编译这个项目。现在我认为有时候不去听VS说的是一个很好的做法。CUDA C/C++不是纯粹的C/C++,在这种情况下,Intellisense是一个C/C++语法检查器。因此,CUDA可能存在问题。这个特殊的问题(在库函数调用的下面加下划线)可能是您可以通过包含某些头文件来解决的问题,但在一般情况下,我的理解是Intellisense不会总是完全满意CUDA代码,因此,如果代码编译和运行正确,我个人不会花太多时间担心intellisense红色下划线。其他人可能有不同的看法。
$ cat t626.cu
#include <stdio.h>
__device__ __constant__ double var1;
__device__ __constant__ int var2;
__global__ void kernel(){
printf("%f\n", var1);
printf("%d\n", var2);
}
int main(){
double var1ToCopy = 10.1;
int var2ToCopy = 1;
cudaError_t cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));
if (cudaStatus != cudaSuccess) {printf("fail1\n"); return 1;}
cudaStatus = cudaMemcpyToSymbol(var2,&var2ToCopy,sizeof(int));
if (cudaStatus != cudaSuccess) {printf("fail2\n"); return 1;}
kernel<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
$ nvcc -arch=sm_20 -o t626 t626.cu
$ ./t626
10.100000
1
$