与cudaMemcpyToSymbol的麻烦 [英] Troubles with cudaMemcpyToSymbol

查看:74
本文介绍了与cudaMemcpyToSymbol的麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试复制到恒定内存中.但是我不能因为对cudaMemcpyToSymbol函数用法的误解.我试图遵循

I'm trying to copy to constant memory. But I can not because of my misunderstanding of usage of cudaMemcpyToSymbol function. I'm trying to follow this

这是一些代码

__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...
}

我知道这是一个非常愚蠢的问题,但是我花了几个小时来寻找答案,但没有成功.

I know it is a very dumb question, but I have spent several hours googling an answer and did not had any success.

推荐答案

您不需要在符号名称上使用与号.符号与指针或变量不同.

You don't need the ampersand on the symbol name. A symbol is not the same as a pointer or a variable.

代替此:

cudaStatus = cudaMemcpyToSymbol((void*)&var1,p1,sizeof(double),0,cudaMemcpyHostToDevice);

执行此操作:

cudaStatus = cudaMemcpyToSymbol(var1,&var1ToCopy,sizeof(double));

我还基于以下事实简化了上述调用:某些参数具有默认值,如

I've also simplified the above call based on the fact that some of the parameters have defaults as indicated in the documentation.

这是一个完整的示例,涉及代码的修改版本(需要cc2.0 + GPU):

Here's a fully worked example around a modfied version of your code (requires cc2.0+ GPU):

$ 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
$

这篇关于与cudaMemcpyToSymbol的麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆