CUDA学习(四)

简介:

编程接口:
CUDA C为熟悉C编程语言的用户提供了一个简单的途径,可以轻松编写程序供设备执行。
它由一组最小的C语言扩展和一个运行时库组成
核心语言扩展已经在编程模型中引入。 它们允许程序员将内核定义为C函数,并在每次调用函数时使用一些新的语法来指定网格和块维度。 所有扩展的完整描述可以在C语言扩展中找到。 任何包含这些扩展名的源文件都必须使用nvcc进行编译,如使用NVCC进行编译所述。
运行时刻(runtime)在编译工作流程中引入。 它提供在主机上执行的C函数,用于分配和释放设备内存,在主机内存和设备内存之间传输数据,管理具有多个设备的系统等。有关运行时刻的完整说明可以参考CUDA参考手册
runtime建在较低级别的C API(CUDA驱动程序API)之上,该API也可由应用程序访问。 驱动程序API通过底层概念(如CUDA上下文 - 设备的主机进程的模拟)以及CUDA模块 - 设备的动态加载库的模拟来提供额外的控制级别。 大多数应用程序不使用驱动程序API,因为它们不需要额外的控制级别,并且在使用runtime时,上下文和模块管理是隐含的,从而产生更简洁的代码。 驱动程序API是在Driver API中引入的,并在参考手册中进行了充分描述。
NVCC编译:
Kernel函数可以用CUDA指令集结构写称为PTX(在PTX参考手册中进行了描述)通常使用C这样的高级语言更加有效。这两种情况下都必须使用nvcc将内核函数编译成二进制代码才能在设备上执行。
nvcc是一个编译器驱动程序,它简化了编译C或PTX代码的过程:它提供了简单和熟悉的命令行选项,并通过调用实现不同编译阶段的工具集合来执行它们。
编译工作流程:
离线编译:
使用nvcc编译的源文件可以包含主机代码和设备代码的混合。nvcc的基本工作流程是将设备代码与主机代码分开,然后:

  • 将设备代码编译成汇编形式(PTX代码)或二进制形式(cubin 对象)
  • 并通过必要的CUDA C运行时机制函数调用来替换内核中引入的<<< ... >>>语法(在执行配置中更详细地描述)来修改主机代码,以从PTX代码加载和启动每个编译的内核或cubin对象。
    修改后的主机代码可以作为C代码输出,可以使用其他工具编译,也可以直接通过让nvcc在上一个编译阶段调用主机编译器

应用程序可以:

  • 链接到已编译的主机代码(这是最常见的情况)
  • 或者忽略已修改的主机代码(如果有的话)并使用CUDA驱动程序API(请参阅驱动程序API)来加载和执行PTX代码或Cubin对象
    即时编译:

应用程序运行时加载的任何PTX代码都会被设备驱动程序进一步编译为二进制代码。 这就是所谓的即时编译。 即时编译增加了应用程序加载时间,但允许应用程序从每个新设备驱动程序随附的新编译器改进中受益。 它也是应用程序在应用程序编译时不存在的设备上运行的唯一方式。
当设备驱动程序即时编译某些应用程序的某些PTX代码时,它会自动缓存生成的二进制代码的副本,以避免在后续调用应用程序时重复编译。 高速缓存(称为计算高速缓存)在设备驱动程序升级时会自动失效,以便应用程序可以从设备驱动程序中内置的新即时编译器。
0f5c3bfa828ba61ee9d0621e4d34970a304e59aa

目录
相关文章
|
并行计算 API 异构计算
|
并行计算 异构计算
|
存储 并行计算 异构计算
|
缓存 并行计算 调度
|
存储 并行计算 异构计算
|
机器学习/深度学习 缓存 并行计算
|
机器学习/深度学习 存储 算法
|
存储 并行计算 异构计算
|
并行计算