0

我在使用 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;mykernel.h 文件。
  • out[idx] = my_const_var;用mykenel.cu替换我内核的最后一行
  • float value = 10.0f; cudaMemcpyToSymbol(my_const_var,&value);在我调用 main.cu 之前添加

完成所有操作后,cudaMemcpyToSymbol 似乎没有复制实际值,因为我得到的结果是“0”而不是“10”。此外,我总是检查 CUDA 错误,但没有。有人可以告诉我我做错了什么吗?为什么 cudaMemcpyToSymbol 不将值复制到符号?我在 Debian Linux 和 CUDA SDK 5.0 上使用带有最新驱动程序的 GeForce9600M(计算能力 1.1)。我还尝试运行 cuda-memcheck 并且没有收到任何错误。

4

1 回答 1

3

由于您试图访问在另一个编译单元中定义的一个编译单元中的变量,(main.cumykernel.cu)这将需要单独的设备编译

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

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

单独编译只适用于sm_20及以上,

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

于 2013-09-20T16:53:39.507 回答