通过生成所有PTX汇编代码CUDA/C++
,我已经为所有GPU计算功能编译了我的(1.x , 2.x , 3.x , 5.0)
项目。
问题是我给定CC的内核效率取决于X
的值MACRO
(在编译时定义)。
那么,有没有办法将X
的值与特定的CC相关联?
我尝试使用__CUDA_ARCH__
如下,但它说identifier MACRO is undefined
谢谢。
#ifdef __CUDA_ARCH__
#if (__CUDA_ARCH__ >= 500)
#define MACRO 10
#elseif (__CUDA_ARCH__ < 500)
#define MACRO 32
#endif
#endif
__global__ kernel ()
{
// some device code using MACRO
}
int main()
{
// some host code using MACRO
kernel <<< >>> ();
return 0;
}
答案 0 :(得分:4)
编译GPU程序时,有两个过程:主机传递和设备传递。
主机传递编译所有主机代码一次,并且未定义此传递__CUDA_ARCH__
。
设备传递为每个目标计算功能编译所有设备代码(__global__
和__device__
)。在这种情况下,__CUDA_ARCH__
已定义。
您的问题是,在您的主机代码(int main()
)中,您尝试使用MACRO
。由于未定义主机传递__CUDA_ARCH__
,因此MACRO
也未定义。您不能在主机代码中使用任何依赖__CUDA_ARCH__
的内容。相反,对于主机代码,您必须使用cudaGetDeviceProporties来确定当前的计算能力。
答案 1 :(得分:3)
问题与CUDA无关,而是与#elseif
预处理程序指令无关,因此无法识别,因此以下
#ifdef __CUDA_ARCH__
#if (__CUDA_ARCH__ >= 500)
#define MACRO 10
#elseif (__CUDA_ARCH__ < 500)
#define MACRO 32
#endif
#endif
它只是等同于
#ifdef __CUDA_ARCH__
#if (__CUDA_ARCH__ >= 500)
#define MACRO 10
#helloworld (__CUDA_ARCH__ < 500)
#define MACRO 32
#endif
#endif
因为宏只是一个文本替换会触发&#34; 未定义MACRO使用&#34;每当使用该定义并且不满足条件时。
解决方案:使用#elif
#ifdef __CUDA_ARCH__
#if (__CUDA_ARCH__ >= 500)
#define MACRO 10
#elif (__CUDA_ARCH__ < 500)
#define MACRO 32
#endif
#endif
编辑:NVCC只是一个编译驱动程序,它控制编译通过设备和主机传递。由于__CUDA_ARCH__
无法完全定义,因此您的定义值在主机通行证中不可见。通常,您不应该在编译时从主机代码处理它。评估在运行时查询功能的可能性(如果PTX中间表示提供的每个体系结构优化不适合您,可能的解决方案可能是为多个体系结构编译内核的专用副本并且你需要做更多的事情&#34;一致&#34;)。