CUDA编程中使用#ifdef指令控制生成CPU和GPU代码
比如:
#include <cstdio>
#include <cuda_runtime.h>__host__ __device__ void say_hello(){
#ifdef __CUDA_ARCH__printf("Hello, world from GPU!\n");
#elseprintf("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 以上的显卡。