CUDA编程接口:使用nvcc编译器的兼容性

简介:

nvcc是一个编译器驱动,简化了C或PTX的编译流程:它提供了简单熟悉的命令行选项,同时通过调用一系列实现了不同编译步骤的工具集来执行它们。本文简介了nvcc的命令选项。完整的描述可在nvcc用户手册中找到。

  相关阅读:

  CUDA编程接口:如何用nvcc编译CUDA程序

  CUDA编程模型:存储器层次和异构编程

  CUDA编程模型:内核与线程层次概述

  CUDA初探:从图形处理到通用并行计算

  CUDA初探:通用并行计算架构和编程模型

        二进制兼容性

  二进制代码是由架构特定的。生成cubin对象时,使用编译器选项-code指定目标架构:例如,用-code=sm_13编译时,为计算能力1.3的设备生成二进制代码 。二进制兼容性保证向后兼容,但不保证向前兼容,也不保证跨越主修订号兼容。换句话说,为计算能力为X.y生成的cubin对象只能保证在计算能力为X.z的设备上执行,这里,z>=y。

  PTX兼容性

  一些PTX指令只被高计算能力的设备支持。例如,全局存储器上的原子指令只在计算能力1.1及以上的设备上支持;双精度指令只在1.3及以上的设备上支持。将C编译成PTX代码时,-arch编译器选项指定假定的计算能力。因此包含双精度计算的代码,必须使用“-arch=sm_13”(或更高计算能力)编译,否则双精度计算将被降级为单精度计算。 为某些特殊计算能力生成的PTX代码始终能够被编译成相等或更高计算能力设备上的二进制代码。(译者注:PTX保证完全的向后兼容,而二进制只保证主修订号相同的向后兼容)

   应用兼容性

  为了在特定计算能力的设备上执行代码,应用加载的二进制或PTX代码必须满足如前文说明的计算能力兼容性。特别地,为了能在将来更高计算能力(不能产生二进制代码)的架构上执行,应用必须装载PTX代码并为那些设备即时编译。 CUDA C应用中嵌入的PTX和二进制代码由-arch和-code编译器选项或-gencode编译器选项控制,详见nvcc用户手册。例如,

  嵌入与计算能力1.0兼容的二进制代码(第一个-gencode选项)和PTX和与计算能力1.1兼容的二进制代码(第二个-gencode选项)。 生成的主机代码在运行时自动选择最合适的代码装载并执行,对于上面例子,将会是:

   1.0二进制代码为计算能力1.0设备,

   1.1二进制代码为计算能力1.1,1.2,1.3的设备,

   通过为计算能力2.0或更高的设备编译1.1PTX代码获得的二进制代码。

  例如,x.cu可有一个使用原子指令的优化代码途径,只能支持计算能力1.1或更高的设备。__CUDA_ARCH__宏可以基于计算能力用于不同的代码途径。它只为设备代码定义。例如,当使用“arch=compte_11”编译时,__CUDA_ARCH__等于110。 使用驱动API的应用必须将代码编译成分立的文件,且在运行时显式装载和执行最合适的文件。 nvcc用户手册为-arch,-code和-gencode编译器选项列出了多种简写。如“arch=sm_13”是“arch=compute_13 ?code=compute_13,sm_13”的简写(等价于“-gencode arch=compute_13,code=\’compute_13,sm_13\’”)。

  C/C++兼容性

  编译器前端依据C++语法规则处理CUDA源文件。主机代码完整支持C++。设备代码只完整支持C++的一个子集,详见附录D。由于使用了C++的语法规则,空指针(如malloc()的返回值)不能赋值给非空指针,必须转型后才能赋值。

  64位兼容性

  在计算能力2.0的设备上,设备代码可以使用64位模式编译(也就是指针是64位的)。只有在主机代码是以64位模式编译的时候,设备代码才支持64位模式。 类似地,32位的nvcc以32位模式编译设备代码,使用32位模式编译的设备代码只支持以32位模式编译的主机代码。 32位的nvcc使用-m64编译选项以64位模式编译设备代码。 64位的nvcc使用-m32编译选项以32位模式编译设备代码。

 










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/736025,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
IDE 编译器 开发工具
编程前的准备:编译器的安装
编程前的准备:编译器的安装
30 0
|
16天前
|
设计模式 API 开发者
框架和函数库的区别
框架和函数库的区别
8 1
|
17天前
|
设计模式 开发框架 测试技术
框架和函数库的区别?
框架和函数库的区别?
|
23天前
|
设计模式 安全 编译器
介绍GCC8 中少数几个能用的C++20 特性
介绍GCC8 中少数几个能用的C++20 特性
14 4
|
25天前
|
安全 编译器 C语言
【C++ 编译器 版本支持】深度解读C++ 版本以及编译器版本相关宏
【C++ 编译器 版本支持】深度解读C++ 版本以及编译器版本相关宏
53 0
|
1月前
|
编译器 Linux C语言
Linux嵌入式系统之交叉编译中编译器与解释器的区别
Linux嵌入式系统之交叉编译中编译器与解释器的区别
13 0
|
1月前
|
敏捷开发 设计模式 Unix
嵌入式C语言代码的基本编写规范要求
嵌入式C语言代码的基本编写规范要求
58 0
|
10月前
|
编解码 Linux Go
嵌入式linux之go语言开发(二)c动态库驱动调用
嵌入式linux之go语言开发(二)c动态库驱动调用
|
Rust 安全 Linux
如何使用 rust 写内核模块
近年来,Rust 语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们看下如何用rust来写Linux内核模块。
226 0
如何使用 rust 写内核模块
|
编译器
由编译器特别支持的包装
由编译器特别支持的包装
44 0