CUDA的软件体系

CUDA的软件堆栈由以下三层构成:CUDA Library、CUDA runtime API、CUDA driver API,如图所示,CUDA的核心是CUDA C语言,它包含对C语言的最小扩展集和一个运行时库,使用这些扩展和运行时库的源文件必须通过nvcc编译器进行编译。

CUDA C语言编译得到的只是GPU端代码,而要管理分配GPU资源,在GPU上分配显存并启动内核函数,就必须借助CUDA运行时的API(runtime API)或者CUDA驱动API(driver API)来实现。在一个程序中只能使用CUDA运行时API与CUDA驱动API中的一种,不能混和使用。

一、CUDA C语言

CUDA C语言为程序提供了一种用C语言编写设备端代码的编程方式,包括对C的一些必要扩展和一个运行时库。CUDA对C的扩展主要包括以下几个方面

1.引入了函数类型限符。用来规定函数是在host还是在device上执行,以及这个函数是从host调用还是从device调用。这些限定符有:__device__,__host__,__global__.

2.引入了变量类型限定符。用来规定变量被存储在哪一类存储器上。传统的在CPU上运行的程序,编译器能自动决定将变量存储在CPU的寄存器还是内存中,在CUDA编程模型中,一共抽象出来多棕8种不同的存储器。为了区分各种存储器,必须引入一些限定符,包括:__device__,__shared__和__constant__。注意,此处的__device__与上节中的__device__限定符的含义不同。

3.引入了内置变量类型。如char4,ushort3,double2,dim3等,它们是由基本的整型可浮点型构成的矢量类型,通过x,y,z,w访问每一个分量,在设备端代码中各矢量类型有不同的对齐要求。

4.引入了4个内建变量。blockIdx和threadIdx用于索引线程块和线程,gridDim和blockDim用于描述线程网格和线程块的维度。warpZize用于查询warp中的线程数量。

5.引入了<<< >>>运算符。用于指定线程网格和线程维度,传递执行参数。

6.引入了一些函灵敏:memory fence函数,同步函数,数学函数,纹理函数,测时函数,原子函数,warp vote函数。

以上扩展均有一些限制,如果违背了这些限制,nvcc将给出错误或警告信息,但有时也不会报错,程序无法运行。

二、nvcc编译器

nvcc编译器根据配置编译CUDA C代码,可以生成三种不同的输出:PTX,CUDA二进制序列和标准C。nvcc是一种编译驱动。通过命令行选项,nvcc可以在编译的不同阶段启动不同的工具完成编译工作。

nvcc工作的基本流程是:首先通过CUDAfe分离源文件中的主机端和设备端代码,然后再调用不同的编译器分别编译。设备端代码由nvcc编译成ptx代码或者二进制代码;主机端代码则将以C文件形式输出,由其他主性能编译器,旧ICC,GCC或者其他合适的高性能编译器等进行编译。不过,也可以直接在编译的最后阶段,将主机端代码交给其他编译器生成.obj或者.o文件。在编译时,可以将设备端代码链接到所生成的主机端代码,将其中的cubin对象作为全局初始化数据数组包含进来。此时,内核执行配置也要被转换为CUDA运行启动代码,以加载和启动编译后的内核函数。使用CUDA驱动API时,可以单独执行ptx代码或者cubin对象,而忽略nvcc编译得到的主机端代码。

编译器前端按照C++语法规则对CUDA源文件进行处理。CUDA主机端代码可以支持完整的C++语法,而设备端代码则不能完全支持。

内核函数可能通过PTX编写,但通常还是通过CUDA C一类的高级语言进行编写。PTX或CUDA C语言编写的内核函数都必须通过nvcc编译器编译成二进制代码。一部分PTX指令只能在拥有较高计算能力的硬件上执行,比如对全局存储器的32bit原子操作指令就只有计算能力1.1以上的硬件才能支持,双精度计算只有计算能力1.3以上的硬件才能支持。nvcc通过编译选项来指定要输出的PTX代码的计算能力。因此,在需要双精度计算时,就必须加上-arch sm_13(或者更高计算能力)编译选项才能正常运行,否则双精度计算将被编译为间精度的计算。

三、运行时API与驱动API

CUDA runtime API和CUDA driver API提供了实现设备管理(Device management),上下文管理(Context management),存储器管理费用(Memory Control),代码块管理 (Code Module management),执行控制(Excution Control),纹理索引管理(Texture Reference management)与OpenGL和Direct3D的互操作性(Interoperity with OpenGL and Direct3D)的应用程序接口。

CUDA runtime API在CUDA driver API 的基础上进行了封装,隐藏了一些实现细节,编程更加方便,代码更加简洁。CUDA runtime API被打包放在CUDAArt包里,其中的函数都有CUDA 前缀。CUDA运行时没有专门的初始化函数,它将在第一次调用函数时自动完成初始化。对使用运行时函数的CUDA程序测试时要避免将这段初始化的时间计入。CUDA runtime API的编程较为简洁,通常都会用这种API进行开发。

CUDA driver API是一种基于句柄的底层接口(式多对象通过句柄被引用),可以加载二进制或汇编形式的内核函数模块,指定参数,并启动计算。CUDA driver API的编程复杂,但有时能通过直接操作硬件的执行实行一些更加复杂的功能键,或者获得更高的性能。由于它使用的设备端代码是二进制或者汇编代码,因此可以在各种语言中调用。CUDA driver API被放在nvCUDA包里,所有函数前缀为cu。

四、CUDA函数库

目前CUDA中有CUFFT,CUBLAS和CUDPP三个函数库,提供了简单高效的常用函数。未来,CUDA中还会提供视频编解码与图像处理库等,如CUVID,进一步扩充功能。CUFFT是利用GPU进行傅立叶变换的函数库,提供了与广泛使用的FFTW库相似的接口。不同的是FFTW操作的数据存储在内在中,而CUFFT操作的数据存储在显存,不能直接相互取代,必须加入显存与内存之间的数据交换,进行封装后才能替代FFTW库。CUBLAS库是一个基本的矩阵与向量运算库,提供了与BLAS相似的接口,可以用于简单的矩阵计算,也可以作为基础构建更加复杂的函数包,如LAPACK等,CUBLAS操作的数据也存储在显存中,同样需要封装后才能替代BLAS中的函数。CUDPP为提供了很多基本的常州用的并行操作灵敏,如排序、搜索等,可以作为基本组件快速地搭建出并行计算程序。调用上述函数库使得程序员无须按照硬件特性设计复杂的算法就能获得很高的性能,大大缩短开发时间;缺点是上述函数库灵活性稍差,并且有可能造成多余的存储器访问。

时间: 2024-10-05 02:36:49

CUDA的软件体系的相关文章

软件体系架构课下作业06

题目:对上学期学习的软件设计模式进行复习,对所有设计模式进行分析,用自己的话来阐述对他们的理解.(不少于2000字) 正如本学期所学习的软件体系架构,还有很多其他的软件工程技术一样,设计模式同样起源于建筑领域他是对前人经验的总结,为后人设计与开发基于面向对象的软件提供指导方针和成熟的解决方案. 从模式的目的而言,设计模式可以分为创建型.结构型和行为型三种.创建型模式主要用于创建对象,它包含5种模式,分别是:工厂方法模式.抽象工厂模式.建造者模式.原型模式和单例模式:结构型模式主要用于处理类和对象

软件体系结构设计心得体会

在修这门课之前,我头脑和实操中写的编代码都还停留在一个小的工程中,或许简单的一个project就能解决绝大部分问题.但是这一个学期的学习之后,我对软件的开发有了一个新的认识.当我认为有些问题可以通过编程解决的时候,那就不能只放眼于具体的代码实现阶段,而是需要用一个类似于软件构架师的思维和角度去仔细思考和斟酌如何才能设计出一个体系结构相对合理,存储方式比较简洁的产品项目.起初我认为这并不难,我一直将代码的编写放在一个软件的重中之重上,因为我觉着它最费脑筋:但是学习完软件体系结构这门课程之后,我不这

LightTools v8.1.0 Win32_64-ISO 2DVD(全新的具有光学精度的交互式三维实体建模软件体系)

LightTools v8.1.0 Win32_64-ISO 2DVD(全新的具有光学精度的交互式三维实体建模软件体系)光学软件: ODS Inc产品: LensVIEW 2003.1-ISO 1CD(世界著名的光学设计数据库) LensVIEW 2001-ISO 1CD OPTIS产品: Optis.OptisWorks.Studio.v2010 1DVD(光学设计) Optis.OptisWorks.Studio.v2007.SP0.1-ISO 1DVD(光学设计) ■□■□■□■□■□■□

全球最低功耗蓝牙单芯片DA14580的软件体系 -层次架构和BLE消息事件处理过程

在作者之前发表的<全球最低功耗蓝牙单芯片DA14580的系统架构和应用开发框架分析>.<全球最低功耗蓝牙单芯片DA14580的硬件架构和低功耗>.<全球最低功耗蓝牙单芯片DA14580的软件体系-RW内核和消息处理机制>三篇文章分析了DA14580的SDK开发目录结构.硬件架构.低功耗.RW内核和消息处理机制.本篇文章将深入到具体的源码去分析DA14580平台的软件层次架构和具体的BLE消息处理过程,以此佐证前面发表的文章. 一.软件层次架构 1.1 BLE协议栈 从中

路由器开发(一)—— 路由器硬件结构及软件体系

一.路由器的硬件构成  路由器主要由以下几个部分组成:输入/输出接口部分.包转发或交换结构部分(switching fabric).路由计算或处理部分.如图所示 图1    路由器的基本组成 输入端口是物理链路和输入包的进口处.端口通常由线卡提供,一块线卡一般支持4.8或16个端口,一个输入端口具有许多功能.第一个功能是进行数据链路层的封装和解封装.第二个功能是在转发表中查找输入包目的地址从而决定目的端口(称为路由查找),路由查找可以使用一般的硬件来实现,或者通过在每块线卡上嵌入一个微处理器来完

全球最低功耗蓝牙单芯片DA14580的软件体系 -RW内核和消息处理机制

上一篇文章<蓝牙单芯片DA14580的硬件架构和低功耗>阐述了DA14580的硬件架构和低功耗的工作原理.本文文章阐述该平台的软件体系,并着重分析消息事件的处理机制. 一.DA14580SOC硬件组成和软件体系组成 DA14580芯片硬件架构包括三个部分: 1)使用ARM公司的cortex M0作为CPUprocessor处理器. 2)使用RivieraWaves公司的IP核作为BLEcore和基带.射频部分. 3)集成时钟管理CMU.电源管理PMU.memory控制存储和其他外围模块控制器,

解读IEEE 7417的软件体系架构描述的概念模型

本文将解读标准IEEE Std 1471-2000(密集型软件的体系结构描述推荐实施规程)的概念模型图部分,从中一窥作为软件架构师的进行架构设计的思考角度与策略.如果我们把世界当做一场游戏,现在要玩的就是策略游戏而已. 说明: IEEE 1471是适用于软件密集的系统,其目标在于:便于体系结构的表达与交流,并通过体系结构要素及其实践标准化,奠定质量与成本的基础. 细读这个标准,可以加强策略游戏的装备,全新上战场. 基本概念 IT框架的设计者必须是杰出的问题驱动者,设计往往是一个模糊的,非理性的过

连载00:推荐:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)

我正在推出本人的心得体会<软件体系设计新方向:数学抽象.设计模式.系统架构与方案设计(袁晓河著)>,由于我从未进行过相关的推广,所以经验欠缺,希望各位给出宝贵意见,谢谢!软件设计正在迈入一个瓶颈时代,软件设计正在越来越衰老!越来越无法推陈出新!设计模式.架构模式.重构.面向对象.AOP.等等一切,我无法忍受这样的陈词滥调,无法忍受这样的似是而非,是什么阻挡我们前进的步伐,是我们不够努力,是我们不思进取,好像都不是.对,都不是!其实这都是我们的思维定势,我们一直以来都是以一种模糊的方式来推进软件

286.软件体系结构研究展望

软件体系结构研究新方向 21世纪软件技术展望1.开放源代码 下一世纪的操作系统将继承现在好的操作系统的主要优点,变成开放的和进化的.在操作系统开放之后,系统软件产业将主要集中在软件环境平台和工具的研究开发上.可视化编程环境与工具.办公套件.家庭套件.学习套件等将会有很大的空间. 21世纪软件技术展望2.跨平台使得一次写好的应用软件在各种不同硬件系统上都可以运行.使得已经设计好的程序模块被有效地重复利用. 目前跨平台这一设想还没有完全有效地被实现,相信21世纪第一个10年一定可以完成.当然,如何解