【发布时间】:2013-04-18 00:53:46
【问题描述】:
在主机代码中,__CUDA_ARCH__ 宏似乎不会生成不同的代码路径,而是会生成与当前设备的代码路径完全相同的代码。
但是,如果__CUDA_ARCH__ 在设备代码中,它将为编译选项 (/arch) 中指定的不同设备生成不同的代码路径。
谁能确认这是正确的?
【问题讨论】:
在主机代码中,__CUDA_ARCH__ 宏似乎不会生成不同的代码路径,而是会生成与当前设备的代码路径完全相同的代码。
但是,如果__CUDA_ARCH__ 在设备代码中,它将为编译选项 (/arch) 中指定的不同设备生成不同的代码路径。
谁能确认这是正确的?
【问题讨论】:
__CUDA_ARCH__ 在设备代码中使用时将携带一个定义的数字,反映当前正在编译的代码架构。
它不打算在主机代码中使用。来自nvccmanual:
此宏可用于 GPU 函数的实现,以确定当前正在为其编译的虚拟架构。主机代码(非 GPU 代码)不能依赖它。
__CUDA_ARCH__ 在主机代码中的使用因此是未定义的(至少由 CUDA 定义)。正如 @tera 在 cmets 中指出的那样,由于宏在主机代码中未定义,因此它可用于区分主机/设备路径,例如,在 __host__ __device__ 函数定义中。
#ifndef __CUDA_ARCH__
//host code here
#else
//device code here
#endif
【讨论】:
__CUDA_ARCH__甚至没有在宿主代码中定义(可以用来区分宿主和设备编译)。这就是为什么主机代码中的测试似乎总是以相同的方式评估的原因。