You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:36:04