【问题标题】:CUDA: cudaMemcpyToSymbol is not copying dataCUDA:cudaMemcpyToSymbol 没有复制数据
【发布时间】:2013-09-21 00:53:39
【问题描述】:

我在使用 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,&amp;value);

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

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

    很遗憾,单独编译仅适用于计算能力 2.0 或更高版本的设备。

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

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

    【讨论】:

    • 我不得不说我没有意识到这一点。太好了,现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2019-07-07
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多