CUDA:CUDAMEMCPITOSYMBOL未复制数据

CUDA:CUDAMEMCPITOSYMBOL未复制数据,cuda,Cuda,我在使用cudaMemcpyToSymbol时遇到问题。我有一个工作正常的代码。我的代码的精简版本如下: mykernel.h file: __global__ void foo(float* out); main.cu文件: #包括“kernels.h” main() { //这里的初始化和声明内容 foo(我的全局内存); //读回全局内存并研究值 } 上面的代码工作得非常完美。现在我想用一个来自常量内存的值替换这个“10”值。所以我所做的是: 添加\uuuuuuu常量\uuuu

我在使用cudaMemcpyToSymbol时遇到问题。我有一个工作正常的代码。我的代码的精简版本如下:

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


main.cu文件:
#包括“kernels.h”
main()
{
//这里的初始化和声明内容
foo(我的全局内存);
//读回全局内存并研究值
}
上面的代码工作得非常完美。现在我想用一个来自常量内存的值替换这个“10”值。所以我所做的是:

  • 添加
    \uuuuuuu常量\uuuuuuuuuuuufloat my\u const\u var在mykernel.h文件中
  • 将内核的最后一行替换为
    out[idx]=my\u const\u var在mykenel.cu中
  • 添加
    浮点值=10.0f;CUDAMEMCPITOSYMBOL(我的常量变量和值)在main.cu中调用之前

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

因为您试图访问一个编译单元中定义在另一个编译单元中的变量,(
main.cu
mykernel.cu
)这将需要

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

不幸的是,单独编译仅适用于compute capability 2.0或更高版本的设备

单独编译仅适用于sm_20及以上版本


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

因为您试图访问在另一个编译单元中定义的一个编译单元中的变量(
main.cu
mykernel.cu
)这将需要更多的时间

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

不幸的是,单独编译仅适用于compute capability 2.0或更高版本的设备

单独编译仅适用于sm_20及以上版本


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

我不得不说,我没有意识到这一点。太好了,现在它起作用了。我不得不说我没有意识到这一点。太好了,现在它可以工作了。
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
}