【问题标题】:String lookup error for global variable in CUDA?CUDA中全局变量的字符串查找错误?
【发布时间】:2011-06-19 21:07:55
【问题描述】:

我有类似的东西:

  • __constant__ double PNT[ NUMCOORDS ];
  • __device__ double PNT[ NUMCOORDS ];

取决于一些预处理器选择。然后我使用这个变量:

cudaMemcpyToSymbol("PNT", point, pntSize)

但是,有时(我真的不知道什么时候让我感到困惑)我收到错误消息:

通过字符串名称查找重复的全局变量

在检查 CUDA 错误时。我尝试用PNT 替换"PNT",奇怪的是,这有效:

cudaMemcpyToSymbol(PNT, point, pntSize)

我应该在实践中使用这个解决方案(而不是使用字符串"PNT")吗?

【问题讨论】:

  • 我认为如果没有更详细的示例,最好是其他人可以复制的形式,很难说出发生了什么。您是否使用不同的宏设置多次解析文件?也许 nvcc 没有更新一些中间文件,结果它同时拥有 constantdevice 变量?
  • 已经谢谢了;只是一个简短的问题:代码cudaMemcpyToSymbol(PNT, point, pntSize) 100% 正确吗?如果是这样,我会坚持使用它,因为我在使用它时不会遇到任何错误!
  • CUDA Library documentation 建议您尝试做的事情是正确的。您可能需要再向该函数传递 2 个参数。但是,我会小心,如果 nvcc 弄乱了变量,它实际上也可能在这个函数中弄乱,通过将数据复制到不正确的目的地。
  • 好的,谢谢,我会调查的,而不仅仅是验证我的程序返回的数据。
  • 您是否在头文件中定义了符号并将其包含在两个不同的文件中?

标签: cuda symbols name-lookup


【解决方案1】:

根本问题与cudaMemcpyToSymbol 无关。您看到的错误是由 CUDA 运行时在搜索您提供的符号时生成的,因为它是在您的代码运行的上下文中多次定义的。 CUDA 运行时版本在检测重复定义(如__constant__ 声明、纹理、__device__ 函数)方面越来越好。

解决方案是重构您的代码,以便符号在应用程序中只定义一次。因为 CUDA 没有链接器,所以如果您在两个文件中定义一个符号,则不会出现编译时错误。但是,当 CUDA 运行时将生成的二进制有效负载从最终链接的应用程序加载到上下文中时,可能会发生重复符号冲突并导致运行时错误。

【讨论】:

  • 从描述中,我假设变量只定义了一次,它的类型(常量或设备)仅取决于一些编译标志。
猜你喜欢
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多