chapter6. programming interface
简介
英伟达 《CUDA C++ Programming Guide》 官方文档学习记录笔记 版本【Release 12.4】出版时间【 Apr 22, 2024】 持续更新中。。。。。。
目录
- chapter6. programming interface
- 简介
- 目录
- 6.1 Compilation with NVCC(NVCC 编译器)
- 6.2 CUDA Runtime
- 6.2.1 Initialization
- 6.2.2 Device Memory
- 6.2.3 Device Memory L2 Access Management
- 6.2.3.1 L2 Cache Set-Aside for Persisting Access
- 6.2.3.2 L2 Policy for Persisting Access
- 6.2.3.3 L2 Access Properties
- 6.2.3.4 L2 Persistence Example
- 6.2.3.5 Reset L2 Access to Normal
- 6.2.3.6 Manage Utilization of L2 set-aside cache
- 6.2.3.7 Query L2 cache Properties
- 6.2.3.8 Control L2 Cache Set-Aside Size for Persisting Memory Access
- 6.2.4 Shared Memory
- 6.2.5 Distributed Shared Memory
- 6.2.6 Page-Locked Host Memory
- 6.2.7 Memory Synchronization Domains
- 6.2.8 Asynchronous Concurrent Execution
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

347

被折叠的 条评论
为什么被折叠?



