为何从__host__ __device__函数调用__host__仅告警、调用__device__报错?
为什么
__host__ __device__函数中调用__host__函数仅触发警告,调用__device__函数触发编译错误? 要搞懂这个差异,得先明确__host__ __device__函数的本质:它会被编译器编译成两个独立版本——一个在CPU(主机端)运行的版本,一个在GPU(设备端)运行的版本。我们分开看两种调用的情况:
调用__host__函数(hst())的情况
- 编译主机端版本的
func()时,调用hst()完全合法,因为hst()本身就是为CPU环境编写的,能正常执行。 - 编译设备端版本的
func()时,问题出现了:hst()没有对应的GPU实现,GPU根本没法执行这个函数。但编译器只抛出警告,是因为它默认你可能不会在设备端实际调用func()——只要你没在GPU代码里用到这个设备端版本,就不会触发运行时错误。但它还是会提醒你这里有潜在的风险。
调用__device__函数(dev())的情况
- 编译主机端版本的
func()时,dev()只有GPU环境的实现,CPU找不到可执行的代码,这是直接的编译期错误——主机端代码根本没法链接或执行这个调用,编译器直接报错终止流程,不会给你留侥幸的空间。 - 虽然编译设备端版本时调用
dev()是合法的,但因为主机端版本的编译已经失败,整个编译就过不去了。
代码示例
__host__ void hst() {} __device__ void dev() {} __host__ __device__ void func() { hst(); // gives a compile warning dev(); // gives a compile error } int main() { }
内容的提问来源于stack exchange,提问作者tommsch
相关产品推荐
相关产品推荐

