CUDA C编程接口技术分析

编程接口

CUDA C为熟悉C编程语言的用户提供了一个简单的路径,可以方便地编写程序供设备执行。
它由C语言的最小扩展集和运行库组成。

核心语言扩展已经引入:cuda c programming guide。它们允许程序员将内核定义为C函数,并在每次调用该函数时使用一些新语法来指定网格和块维度。任何包含这些扩展名的源文件都必须用nvcc编译。

在编译工作流中引入了运行时。它提供在主机上执行的C函数,用于分配和解除分配设备内存、在主机内存和设备内存之间传输数据、管理具有多个设备的系统等。运行时的完整描述可在CUDA参考手册中找到。

运行时构建在较低级别的C API(CUDA驱动程序API)之上,应用程序也可以访问该API。驱动程序API通过公开较低级别的概念(如CUDA上下文——设备的主机进程模拟)和CUDA模块——设备的动态加载库模拟,提供了额外的控制级别。大多数应用程序不使用驱动程序API,因为它们不需要这种额外的控制级别,并且在使用运行时,上下文和模块管理是隐式的,从而产生更简洁的代码。驱动程序API在驱动程序API中介绍,并在参考手册中详细描述。

1. 使用NVCC编译

内核可以使用CUDA指令集体系结构(称为PTX)编写,PTX参考手册中对此进行了描述。然而,使用高级编程语言(如C)通常更有效。在这两种情况下,内核必须由nvcc编译成二进制代码才能在设备上执行。

nvcc是一个编译器驱动程序,它简化了编译C或PTX代码的过程:它提供简单而熟悉的命令行选项,并通过调用实现不同编译阶段的工具集合来执行这些选项。本节概述了nvcc工作流和命令选项。完整的描述可以在nvcc用户手册中找到。

1.1. 编制工作流程

1.1.1.离线编译

用nvcc编译的源文件可以包括主机代码(即,在主机上执行的代码)和设备代码(即,在设备上执行的代码)的混合。nvcc的基本工作流程是将设备代码与主机代码分离,然后:

·将设备代码编译为汇编形式(PTX代码)和/或二进制形式(cubin对象),

·修改宿主代码,用必要的CUDA C运行时函数调用替换内核中引入的语法(并在执行配置中详细描述),以便从PTX代码和/或cubin对象加载和启动每个编译的内核。
修改后的主机代码输出为C代码,该代码将留在使用另一个工具编译时使用,或者通过让nvcc在最后一个编译阶段调用主机编译器直接作为目标代码输出。

应用程序可以:

·链接到已编译的主机代码(这是最常见的情况),

·或者忽略修改后的主机代码(如果有的话),并使用CUDA驱动程序API(请参阅驱动程序API)来加载和执行PTX代码或cubin对象。

1.1.2. 及时编译

应用程序在运行时加载的任何PTX代码都由设备驱动程序进一步编译为二进制代码。这称为即时编译。即时编译增加了应用程序加载时间,但允许应用程序从每个新设备驱动程序带来的任何新编译器改进中获益。这也是应用程序在编译应用程序时不存在的设备上运行的唯一方法,如应用程序兼容性中所述。

当设备驱动程序及时为某个应用程序编译一些PTX代码时,它会自动缓存生成的二进制代码的副本,以避免在随后的应用程序调用中重复编译。当设备驱动程序升级时,缓存(称为计算缓存)会自动失效,因此应用程序可以从设备驱动程序中内置的新实时编译器的改进中获益。

环境变量可用于控制CUDA环境变量中描述的实时编译。

1.2.二进制兼容性

二进制代码是特定于体系结构的。cubin对象是使用指定目标体系结构的编译器选项-code生成的:例如,使用-code=sm_35编译会为具有计算能力3.5的设备生成二进制代码。二进制兼容性保证从一个小版本到下一个小版本,但不是从一个小版本到上一个小版本或跨主要版本。换句话说,为计算能力X.y生成的cubin对象将只在计算能力X.z的设备上执行,其中z≥y。

1.3. PTX兼容性【PTX兼容性】

某些PTX指令仅在具有更高计算能力的设备上受支持。例如,Warp Shuffle函数仅在计算能力为3.0及以上的设备上受支持。-arch编译器选项指定在编译C到PTX代码时假设的计算能力。例如,包含warp shuffle的代码必须使用-arch=compute_30(或更高版本)编译。
为某些特定计算能力生成的PTX代码始终可以编译为具有更大或同等计算能力的二进制代码。请注意,从早期PTX版本编译的二进制文件可能无法使用某些硬件功能。例如,从为计算能力6.0(Pascal)生成的PTX编译的计算能力7.0(Volta)的二进制目标设备将不会使用张量核心指令,因为这些指令在Pascal上不可用。因此,最终的二进制文件的性能可能比使用最新版本的PTX生成的二进制文件的性能差。

1.4. 应用程序兼容性

要在具有特定计算能力的设备上执行代码,应用程序必须加载与此计算能力兼容的二进制或PTX代码,如二进制兼容性和PTX兼容性中所述。特别是,为了能够在具有更高计算能力的未来架构上执行代码(还不能生成二进制代码),应用程序必须加载PTXcode,该PTXcode将为这些设备及时编译(请参阅及时编译)。

哪个PTX和二进制代码嵌入到CUDA C应用程序中,由-arch和-code编译器选项或-gencode编译器选项控制,如nvcc用户手册中所述。例如,

嵌入与计算能力3.5和5.0(第一和第二gencode选项)兼容的二进制代码,以及与计算能力6.0(第三gencodepoption)兼容的PTX和二进制代码。

生成宿主代码是为了在运行时自动选择要加载和执行的最合适的代码,在上面的示例中,将是:

·3.5计算能力为3.5和3.7的设备的二进制代码,

·5.0计算能力为5.0和5.2的设备的二进制代码,

·6.0计算能力为6.0和6.1的设备的二进制代码,

·PTX代码,在运行时为具有计算能力7.0及更高版本的设备编译为二进制代码。

x.cu可以有一个优化的代码路径,使用warp shuffle操作,例如,只有计算能力3.0及更高的设备才支持这种操作。可以使用“CUDA ARCH”宏根据计算能力区分不同的代码路径。它只为设备代码定义。例如,当使用-arch=compute_35编译时,__CUDA_ARCH_等于350。
使用驱动程序API的应用程序必须编译代码以分离文件,并在运行时显式加载和执行最合适的文件。

Volta架构引入了独立的线程调度,它改变了GPU上线程的调度方式。对于依赖于以前架构中SIMT调度的特定行为的代码,独立的线程调度可能会改变参与线程的集合,从而导致错误的结果。为了帮助迁移,同时实现独立线程调度中详述的纠正操作,Volta开发人员可以选择使用编译器选项-arch=compute_60 -code=sm_70来执行Pascal的线程调度。

nvcc用户手册列出了-arch、-code和-gencode编译器选项的各种简写。例如,

-arch=sm_35 is a shorthand for -arch=compute_35-code=compute_35, sm_35 (which is the same as -gencodearch=compute_35, code=‘compute_35,sm_35’).

1.5、C/C++兼容性

编译器的前端编译器根据C++语法规则处理CUDA源文件。但是,对于C/C++语言描述的设备代码,只支持C++的一个子集。

1.6. 64位兼容性

64位版本的nvcc以64位模式编译设备代码(即指针为64位)。只有在64位模式下编译的主机代码才支持在64位模式下编译的设备代码。

类似地,32位版本的nvcc以32位模式编译设备代码,而32位模式编译的设备代码仅支持以32位模式编译的主机代码。

32位版本的nvcc还可以使用-m64编译器选项以64位模式编译设备代码。

64位版本的nvcc可以使用-m32编译器选项以32位模式编译设备代码。

CUDA C编程接口技术分析相关推荐

  1. 8086cpu 可编程接口技术(一)

    可编程接口技术 一,并行接口(重难点) 1,8255A 的结构和功能(重点) 1,输入/输出端口 2,读/写控制逻辑 3,A组/B组控制电路 4,数据总线缓冲器 2,8255A 的工作方式与应用(难点 ...

  2. CUDA C++编程接口:编译

    CUDA C++编程接口:编译 一.概述 CUDA C++为熟悉C++编程语言的用户提供了一个简单的路径,以方便地编写程序以执行该设备. 它由一组最小的扩展到C++语言和运行库. 在编程模型中引入了核 ...

  3. CUDA C 编程指南

    说明 最近在学习CUDA,感觉看完就忘,于是这里写一个导读,整理一下重点 主要内容来源于NVIDIA的官方文档<CUDA C Programming Guide>,结合了另一本书<C ...

  4. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  5. 【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计]

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  6. 树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程

    内容目录: 一.树莓派Pico开发板直流电机接口技术 1.H桥驱动电路的基本工作原理 2.典型H桥驱动电路分析 3.DRV8833双H桥电机驱动模块介绍 4.Pico开发板与直流电机接口 二.Pico ...

  7. 汇编语言笔记——接口技术与编程

    文章目录 传送门 储存系统与技术 材料 高速储存器缓冲储存器(Cache) 材料,局部性,访问方式 Cache全相联映射 Cache交换与一致性 单核CPU一致性处理 多核CPU的MESI协议 主储存 ...

  8. 可编程定时器/计数器(微机接口技术)

    微型计算机原理与接口技术 文章目录 微型计算机原理与接口技术 可编程定时器/计数器 可编程定时/计数器接口芯片8253 (和8254差不多) 功能 定时或计数实现方法 基本原理 8253的内部结构 8 ...

  9. (CUDA 编程5).CUDA编程接口(一)------一十八般武器

    (CUDA 编程5).CUDA编程接口(一)------一十八般武器 作者:赵开勇 来源:http://www.hpctech.com/2009/0818/203.html 子曰:工欲善其事,必先利其 ...

最新文章

  1. php中mysql_PHP中MySQL操作
  2. 2015.1.3 让CombBox自动弹出下拉框
  3. 关于clientWidth、offsetWidth、clientHeight、offsetHeigh
  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式
  5. Kafka使用遇到的坑
  6. Dubbo服务引用原理
  7. 为何银联选择了Apple pay?
  8. VTK:可视化之StructuredDataTypes
  9. C++(11)--编程实践1-经典养成类游戏简单实践
  10. math.asin_JavaScript中带有示例的Math.asin()方法
  11. Python学得好,升职加薪下班早
  12. 微软宣布提供Azure Cognitive Services容器支持
  13. 代码整洁之道读书笔记----第三章---函数--第一节-专注且短小
  14. 心电图分析软件_动态心电图品牌排行榜
  15. 浅议公司现场5S管理内部验收基准
  16. Windows调试技巧工具
  17. oracle gbk 无法识别,oracle 字符集总结(超出GBK范围的字符存取问题未解决)
  18. android emoji转换成字符串,安卓的emoji表情转换为文字
  19. Life with qmail -- 中文版(英文版本2 Jan 2006)
  20. css3 制作音乐播放器音乐播放跳动音符

热门文章

  1. mysql查询字段大小写结果相同,mysql大小写查询不敏感,mysql5.7查询不区分大小写解决方案。
  2. 余弦相似和内积的意义? 区别
  3. LeetCode简单题之数组序号转换
  4. LeetCode简单题之两个数对之间的最大乘积差
  5. Golang的交叉编译问题
  6. TVM 图优化Graph Optimization
  7. 2021年大数据Spark(一):框架概述
  8. HarmonyOS UI开发 StackLayout(堆栈布局) 的使用
  9. android 8.0 ,9.0 静态广播不显示问题处理
  10. Kotlin中var和val的区别