如何通过#define在编译时获得CUDA Compute功能(版本)?例如,如果我使用__ballot并使用
nvcc -c -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_13,code=sm_13
source.cu
Run Code Online (Sandbox Code Playgroud)
我可以通过#define获取我的代码中的计算能力版本,以便选择带有__ballot的代码分支吗?
har*_*ism 15
是.首先,最好了解使用时会发生什么-gencode
.NVCC将多次编译您的输入设备代码,每个设备目标架构一次.因此,在您的示例中,NVCC将为compute_20运行一次编译阶段1,对compute_13运行一次.
当nvcc编译.cu文件时,它定义了两个预处理器宏,__CUDACC__
和__CUDA_ARCH__
.__CUDACC__
没有值,如果cudacc是编译器,则简单定义,如果不是,则定义.
__CUDA_ARCH__
被定义为表示正在编译的SM版本的整数值.
引用CUDA工具包附带的NVCC文档:
在编译的每个nvcc编译阶段1期间,为体系结构标识宏
__CUDA_ARCH__
分配一个三位数值字符串xy0
(以字面值0结尾)compute_xy
.该宏可用于GPU功能的实现,以确定当前正在编译的虚拟体系结构.主机代码(非GPU代码)不得依赖它.
因此,在您要使用的情况下__ballot()
,您可以这样做:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4592 次 |
最近记录: |