本文介绍了在CUDA和C ++中名称调整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用来自PGI的 pgcpp 编译的我的C ++项目 main.cpp ,调用一个函数 cuda()包含单独文件中的CUDA代码 cuda.cu ,使用 nvcc 。除非我在函数声明和公共头文件中用 cuda()函数包装 externC获取链接错误(未定义的引用)。



没有 externC

  $ nm main.o | grep -y cuda 
U cuda__FPfPiT2iN32
$ nm cuda.o | grep -y cuda
T _Z13cudaPfPiS0_iS0_S0_S0_

使用 externC (符号名称匹配=>链接工作正常):

  $ nm main.o | grep -y cuda 
U cuda
$ nm cuda.o | grep -y cuda
T cuda

这是我的印象, nvcc 使用宿主代码的主机C ++编译器,因此它会像C ++那样修改符号名称?



编辑:这可能是因为 nvcc 实际使用GNU编译器 gcc 为主机代码,并且这个编译器修改名称不同于 pgcpp



EDIT2:我的系统有pgcpp 14.9,gcc 4.4.7,nvcc / CUDA 6.5

解决方案

nvcc 默认使用主机gcc / g ++(gnu)工具链。



PGI提供了两种略有不同的工具链来编译C ++代码。使用 pgcpp 工具调用一个工具链。此工具链不是 gnu兼容的,不一定会产生与gnu兼容的名称。使用 pgc ++ 工具调用其他工具链,并将其标注为gnu兼容,并且应该生成与gnu兼容的名称调试。



nvcc 和PGI工具产生的对象之间链接这种类型的问题应该使用 pgc ++ 工具



另外,使用CUDA 7现在可以使用PGI编译器( pgc ++ )作为 nvcc 的主机编译器。但是这不是这里问题的关键,虽然切换到主机编译器将以类似的方式修复链接问题。



在当前版本的(例如第xv页)和:

Note that pgc++ is now (2015) considered "default" and pgcpp is listed as "deprecated."

这篇关于在CUDA和C ++中名称调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 09:43