当前位置: 首页 > article >正文

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


http://www.kler.cn/a/159296.html

相关文章:

  • 已解决:spark代码中sqlContext.createDataframe空指针异常
  • 谷歌AI进军教育,这将改变未来?
  • MySQL【五】
  • 金山云Java 开发面试题及参考答案
  • 时钟之CSS+JS版
  • 【知识科普】微内核架构与宏内核架构
  • 【无标题】从0到1 搭建一个vue3+Django项目
  • 【数据库】MSSQL 注入入门级的讲解
  • 【C语言】指针与数组的潜在联系
  • RNN、Seq2Seq、Transformers:NLP 中常用的神经架构简介
  • 计算机操作系统2
  • 三轴加速度计LIS2DW12开发(2)----基于中断信号获取加速度数据
  • 统信UOS_麒麟KYLINOS上安装特定版本python
  • MVC、MVP、MVVM模式的区别
  • std::move
  • C++h弧度转成角度
  • 备战春招——12.05算法
  • IntelRealSense深度相机D455在ROS1运行中的消息内容
  • Linux定时循环备份指定文件或文件夹,每月永久备份留1份
  • Linux基础命令(测试相关)
  • Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标
  • 【Polar靶场WEB签到】
  • ES通过抽样agg聚合性能提升3-5倍
  • 【算法思考记录】力扣2477. 到达首都的最少油耗【JavaScript,深度优先搜索】
  • flink运行报Exception in thread “main“ java.lang.IllegalStateException
  • Linux 基础知识整理(三)