CUDA编程接口:使用nvcc编译器的兼容性-阿里云开发者社区

开发者社区> 余二五> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
YFIOServer 后台IO接口使用说明
YFIOServer 后台IO接口使用说明
310 0
Kubernetes必备知识: 容器接口CRI
每种容器运行时各有所长,许多用户都希望Kubernetes支持更多的运行时。在Kubernetes 1.5发布版里,我们引入了CRI–一个能让kubelet无需编译就可以支持多种容器运行时的插件接口。CRI包含了一组protocol buffers,gRPC API,相关的库,以及在活跃开发下的额外规范和工具。CRI目前是Alpha版本。 支持可替换的容器运行时在Kubernetes中概念中并非首次。在1.3发布版里,我们介绍了rktnetes项目,它可以让rkt容器引擎作为Docker容器运行时的一个备选。然而,不管是Docker还是Rkt都需要通过内部、不太稳定的接口直接集成到kubele
219 0
在使用蓝牙接口,遇到IOS下正常,Android下不正常的简易处理方法
如果遇到以上的情况怎么办,先确定下在调试的时候是否打开了调试面板, 如果有打开请关闭调试面板看是否还有问题,目前在安卓上打开调试面板是会有影响到蓝牙接口的使用,从之前遇到过这些问题的统计中也确实是因为这个原因
238 0
如何判断自己使用的接口需要签约
说明:     很多同学可能不知道支付宝有些接口需要签约(我们称之为需签约接口),   有些不需要签约(我们称之为添加功能型接口)   应用如何创建:[url]https://openclub.alipay.
189 0
+关注
12613
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载