我在使用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”值。所以我做的是:
__constant__ float my_const_var;
。out[idx] = my_const_var;
替换我内核的最后一行
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而且没有错误。
答案 0 :(得分:2)
由于您试图访问另一个编译单元(main.cu
和mykernel.cu
)中定义的一个编译单元中的变量,因此需要separate device compilation。
在5.0发布之前,CUDA不支持单独编译,因此CUDA代码无法调用设备函数或跨文件访问变量。
不幸的是,单独的编译仅适用于计算能力为2.0或更高的设备。
单独编译仅适用于sm_20及更高版本,
您可以通过将必须引用给定变量的所有CUDA代码放在同一文件(声明变量的同一文件)中来解决pre-cc2.0。