记录 | CUDA编程中使用#ifdef指令控制生成CPU和GPU代码

CUDA编程中使用#ifdef指令控制生成CPU和GPU代码

比如:

#include 
#include 

__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 以上的显卡。

你可能感兴趣的:(踩坑记录,CUDA,CUDA编程,#ifdef,CPU,GPU)