根据GPU计算能力定义MACRO

时间:2014-08-14 09:21:59

标签: c++ cuda compilation

通过生成所有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; 
}

2 个答案:

答案 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;)。