记录 | CUDA编程中使用#ifdef指令控制生成CPU和GPU代码
CUDA编程中使用#ifdef指令控制生成CPU和GPU代码
比如:
#include <cstdio>
#include <cuda_runtime.h>
__host__ __device__ void say_hello(){
#ifdef __CUDA_ARCH__
printf("Hello, world from GPU!\n");
#else
printf("Hello, world from CPU!\n");
#endif
}
__global__ void kernel(){
say_hello();
}
int main(){
kernel<<<1, 1>>>();
cudaDeviceSynchronize();
say_hello();
return 0;
}
● CUDA编译器具有多段编译的特点;
● 一段代码他会先送到 CPU 上的编译器 (通常是系统自带的编译器如 gcc 和 msvc) 生成 CPU 部分的指令码。然后送到真正的 GPU 编译器生成 GPU 指令码。最后再链接成同一个文件,看起来好像只是编译了一次一样,实际上你的代码会被预处理很多次;
● 他在 GPU 编译模式下会定义 __CUDA_ARCH__
这个宏,利用 #ifdef 判断这个宏是否定义,就可以判断当前是否处于 GPU 模式,从而实现一个函数针对 GPU 和 CPU 生成两份源码级不同的代码;
__CUDA_ARCH__
是一个整数,表示当前编译所针对的 GPU 的架构版本号是多少,这个版本号是编译时指定的八本,不是运行时检测到的版本。编译器默认就是最老的52,能够兼容所有GTX900 以上的显卡。