CUDA中全局变量的字符串查找错误?

CUDA中全局变量的字符串查找错误?,cuda,symbols,name-lookup,Cuda,Symbols,Name Lookup,我有以下两种情况: \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu \uuuuuuu设备\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 取决于某些预处理器选择。然后我使用这个变量: cudaMemcpyToSymbol(“PNT”,point,pntSize) 然而,有时(我真的不知道什么时候会让我感到困惑)我会收到

我有以下两种情况:

  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • \uuuuuuu设备\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
取决于某些预处理器选择。然后我使用这个变量:

cudaMemcpyToSymbol(“PNT”,point,pntSize)

然而,有时(我真的不知道什么时候会让我感到困惑)我会收到错误信息:

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

检查CUDA错误时。我试着用
PNT
替换
“PNT”
,奇怪的是,这种方法有效:

cudaMemcpyToSymbol(PNT、point、pntSize)


我应该在实践中使用此解决方案(而不是使用字符串
“PNT”
)?

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


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

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


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

我认为,如果没有更详细的示例,很难判断发生了什么,最好是以其他人可以复制的形式。是否使用不同的宏设置多次解析文件?也许nvcc没有更新一些中间文件,它最终拥有常量和设备变量?谢谢;只是一个简短的问题:代码
cudaMemcpyToSymbol(PNT,point,pntSize)
100%正确吗?如果是这样的话,我会坚持使用它,因为我在使用它时不会出现任何错误!表明你试图做的是正确的。您可能需要向该函数再传递2个参数。但是,我会小心,如果nvcc弄乱了变量,它实际上也可能会弄乱这个函数,将数据复制到错误的目标。好的,谢谢,我将对此进行研究,而不仅仅是验证我的程序返回的数据。您是否在头文件中定义了符号并将其包含在两个不同的文件中?我认为如果没有更详细的示例,很难判断发生了什么,最好是以其他人可以复制的形式。是否使用不同的宏设置多次解析文件?也许nvcc没有更新一些中间文件,它最终拥有常量和设备变量?谢谢;只是一个简短的问题:代码
cudaMemcpyToSymbol(PNT,point,pntSize)
100%正确吗?如果是这样的话,我会坚持使用它,因为我在使用它时不会出现任何错误!表明你试图做的是正确的。您可能需要向该函数再传递2个参数。但是,我会小心,如果nvcc弄乱了变量,它实际上可能也会弄乱这个函数,因为它会将数据复制到不正确的目标。好的,谢谢,我会研究一下,而不仅仅是验证我的程序返回的数据。您是否在头文件中定义了符号,并将其包含在两个不同的文件中?从描述中,我假设变量只定义了一次,其类型(常量或设备)仅取决于某个编译标志。根据描述,我假设变量只定义了一次,其类型(常量或设备)仅取决于某个编译标志。