CUDA:cudaMemcpyToSymbol没有复制数据

时间:2013-09-20 16:38:05

标签: cuda

我在使用cudaMemcpyToSymbol时遇到问题。我有一个工作正常的代码。我的代码的缩减版本是:

mykernel.h file:
__global__ 
void foo(float* out);

mykernel.cu file:
#include "kernels.h"
__global__ 
void foo(float* out)
{
    uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
    out[idx] = 10;
}

main.cu file:
#include "kernels.h"
main()
{
    // initialization and declaration stuff here

    foo<<<1,1,1>>>(my_global_memory);

    // read back global memory and investigate values
}

上面的代码非常完美。现在我想用来自常量内存的值替换这个“10”值。所以我做的是:

  • 在mykernel.h文件中添加__constant__ float my_const_var;
  • 用mykenel.cu
  • 中的out[idx] = my_const_var;替换我内核的最后一行
  • 在main.cu
  • 中调用之前添加float value = 10.0f; cudaMemcpyToSymbol(my_const_var,&value);

完成所有操作后,看起来cudaMemcpyToSymbol不会复制实际值,因为我得到'0'而不是'10'的结果。另外,我总是检查CUDA错误,但没有。有人能告诉我我做错了什么吗?为什么cudaMemcpyToSymbol不会将值复制到符号?我在Debian Linux和CUDA SDK 5.0上使用GeForce9600M(计算能力1.1)和最新的驱动程序。我也尝试过运行cuda-memcheck而且没有错误。

1 个答案:

答案 0 :(得分:2)

由于您试图访问另一个编译单元(main.cumykernel.cu)中定义的一个编译单元中的变量,因此需要separate device compilation

  

在5.0发布之前,CUDA不支持单独编译,因此CUDA代码无法调用设备函数或跨文件访问变量

不幸的是,单独的编译仅适用于计算能力为2.0或更高的设备。

  

单独编译仅适用于sm_20及更高版本,

您可以通过将必须引用给定变量的所有CUDA代码放在同一文件(声明变量的同一文件)中来解决pre-cc2.0。