cuda C++ 编程指南 第六章 编程接口(上)

部署运行你感兴趣的模型镜像

chapter6. programming interface

简介

英伟达 《CUDA C++ Programming Guide》 官方文档学习记录笔记 版本【Release 12.4】出版时间【 Apr 22, 2024】 持续更新中。。。。。。

目录

6.1 Compilation with NVCC(NVCC 编译器)

  CUDA C++ 为熟悉 C++ 编程语言的用户提供了一个简单的路径,可以轻松编写设备执行的程序。它由 C++ 语言和运行时库的最小扩展集组成。核心语言扩展已在编程模型中引入。它们允许程序员将内核定义为 C++ 函数,并使用一些新的语法在每次调用函数时指定网格和块维度。所有扩展的完整描述可以在 C++ 语言扩展中找到。任何包含其中一些扩展的源文件都必须使用 nvcc 编译,如与 NVCC 编译中所述。运行时在CUDA运行时引入。它提供了在主机上执行的 C 和 C++ 函数来分配和释放设备内存、主机内存和设备内存之间的传输数据、具有多个设备的管理系统等。
  这一节的NVCC编译流程图会在6.16节总结中。

6.1.1 Compilation Workflow(编译工作流)

6.1.1.1 Offline Compilation (离线编译)

  使用 nvcc 编译的源文件可以包括主机代码(即主机上执行的代码)和设备代码(即设备上执行的代码)的混合。nvcc的基本工作流程包括将设备代码与主机代码分离,然后:
▶将设备代码编译成汇编形式(PTX代码)和/或二进制形式(cubin对象),
▶并通过替换<<<…>>>在内核中引入的语法,通过必要的CUDA运行时函数调用加载并从PTX代码或cubin对象启动每个编译的核。修改后的主机代码要么输出为 C++ 代码,该代码左使用另一个工具编译,要么通过让 NVcc 在最后一个编译阶段调用主机编译器直接编译为对象代码。然后应用程序可以:
▶链接到编译的主机代码(这是最常见的情况),
▶ 或忽略修改后的主机代码(如果有的话),并使用 CUDA 驱动程序 API加载并执行 PTX 代码或cubin对象。

6.1.1.2 Just-In-Time Compilation (即时编译)

  在运行时由应用程序加载的任何 PTX 代码都由设备驱动程序进一步编译为二进制代码。这称为即时编译。

6.1.2 Binary Compatibility (二进制兼容性)

  二进制代码是特定于架构的。cubin对象是使用编译器选项生成的——代码指定目标架构:例如,使用 -code=sm_80 编译为计算能力 8.0 的设备生成二进制代码。二进制兼容性从对下一个稍作修改来保证,但不能从对前一个或重大修订的微小修改中保证。

6.1.3 PTX Compatability (PTX 兼容性)

  一些 PTX 指令仅在计算能力较高的设备上支持。-archcompiler 选项指定将 C++ 编译为 PTX 代码时假设的计算能力。例如,-arch=compute_50仅在计算能力 5.0 和上述设备上支持。从为计算能力 6.0 (Pascal) 生成的 PTX 编译的计算能力 7.0 (Volta) 的二进制目标设备将不使用 Tensor Core 指令,因为这些在 Pascal 上不可用。因此,如果使用最新版本的 PTX 生成二进制,最终的二进制可能会的性能比可能差。编译为目标架构条件特征的 PTX 代码仅在完全相同的物理架构上运行,在其他架构上运行。Arch 条件 PTX 代码不是前向和后向兼容的。

6.1.4 Applicvation Compatibility (应用兼容性)

  为了在特定计算能力的设备上执行代码,应用程序必须加载与二进制兼容性和 PTX 兼容性中描述的这种计算能力兼容的二进制或 PTXcode。特别是,为了能够在未来具有更高计算能力的架构上执行代码(尚未生成二进制代码),应用程序必须加载为这些设备编译的 PTX 代码(参见即时编译)。
  注:Volta架构加入了独立的线程调度,所以需要使用编译器选项组合选择到 Pascal 的线程调度-arch=compute_60 -code=sm_70。

6.1.5 C++ Compatability (C++ 兼容性)

  编译器前端处理CUDA文件依据C++语法规则。主机代码支持完整的C++代码,设备代码支持部分的C++代码。

6.1.6 64-Bit Comapatibility (64位兼容性)

  64位模式编译的设备代码只支持以64位模式编译的主机代码。
编译流程(附流程图)
  1.NVCC将所有代码分离为主机和设备code
  2.设备code会编译为PTX代码,再将PTX编译为二进制cubin目标代码
  3.编译为PTX时需要-arch = compute_xx选项,指定虚拟架构的计算能力,以便于代码可以使用cuda功能
  4.PTX编译为cubin时,用-code = sm_xx选项指定目标架构,以便于代码可以运行在真实目标架构上,以便于确定可执行文件能够使用的GPU
编译流程图

6.2 CUDA Runtime (CUDA运行时)

6.2.1 Initialization (初始化)

6.2.2 Device Memory (设备内存)

6.2.3 Device Memory L2 Access Management (设备内存L2访问管理)

6.2.3.1 L2 Cache Set-Aside for Persisting Access (L2缓存持久化访问)
6.2.3.2 L2 Policy for Persisting Access (L2持久化访问策略)
6.2.3.3 L2 Access Properties (L2访问属性)
6.2.3.4 L2 Persistence Example (L2持久化示例)
6.2.3.5 Reset L2 Access to Normal (重置L2访问到正常)
6.2.3.6 Manage Utilization of L2 set-aside cache (管理L2缓存的利用率)
6.2.3.7 Query L2 cache Properties (查询L2缓存属性)
6.2.3.8 Control L2 Cache Set-Aside Size for Persisting Memory Access (控制L2缓存持久化内存访问大小)

6.2.4 Shared Memory (共享内存)

6.2.5 Distributed Shared Memory (分布式共享内存)

6.2.6 Page-Locked Host Memory (页锁定主机内存)

6.2.6.1 Portable Memory (可移植内存)
6.2.6.2 Write-Combining Memory (写合并内存)
6.2.6.3 Mapped Memory (映射内存)

6.2.7 Memory Synchronization Domains (内存同步域)

6.2.7.1 Memory Fence Interference (内存栅栏干扰)
6.2.7.2 Isolating Traffic with Domains (使用域隔离流量)
6.2.7.3 Using Domains in CUDA (在CUDA中使用域)

6.2.8 Asynchronous Concurrent Execution (异步并发执行)

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马敲马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值