在__global__函数中调用__host__ __device__函数报exit code 255如何解决
错误原因
- CUDA 中被
__host__ __device__修饰的函数会被 nvcc 编译生成两份独立实例:一份供主机侧 CPU 调用,一份供设备侧 GPU 调用。 - 你将
test()函数的实现放在了.cpp文件中,默认会被普通 C++ 编译器(GCC/Clang/MSVC)编译,普通 C++ 编译器不识别 CUDA 专属的函数修饰符,只会生成主机侧的test()函数实例,不会生成设备侧可用的实例。 - 当你在核函数
gpu()中调用test()时,nvcc 在链接阶段找不到设备侧的test()函数实现,就会触发无明确报错信息的退出码 255 问题。而主机侧调用test()时可以找到 C++ 编译器生成的主机版本,因此不会出现异常。
修复方案
可选择以下任意一种方案解决问题:
- 方案1:将
test.cpp重命名为test.cu,使用 nvcc 编译该文件。nvcc 会自动生成__host__ __device__修饰函数的主机、设备两份实例,核函数调用时即可找到对应的设备侧实现。 - 方案2:不修改文件后缀,在编译配置中指定将
test.cpp作为 CUDA 文件用 nvcc 编译:- 命令行编译时,直接将
test.cpp作为 nvcc 的输入参数即可,示例命令:nvcc test.cpp kernel.cu -o demo - Visual Studio 环境下,右键点击
test.cpp文件→「属性」→「常规」→「项类型」,选择「CUDA C/C++」即可。
- 命令行编译时,直接将
- 方案3:如果后续仅需要在设备侧调用
test(),可以将test()的实现直接放到test.hpp头文件中,同时添加inline修饰避免重定义问题,也可以正常编译。
内容的提问来源于stack exchange,提问作者Gaberocksall
相关产品推荐
相关产品推荐

