归约是使用解决其它问题的”黑盒”来解决另一个问题.
CUDA架构用作GPU通用计算。
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其中包含70条指令。
(据称是“3D No Waiting!”的缩写)是由AMD开发的一套SIMD多媒体指令集,支持单精度浮点数的矢量运算,用于增强x86架构的计算机在三维图像处理上的性能。
MMX 是MultiMedia eXtensions(多媒体扩展)的缩写,是第六代CPU芯片的重要特点。MMX技术是在CPU中加入了特地为视频信号(Video Signal),音频信号(Audio Signal)以及图像处理(Graphical Manipulation)而设计的57条指令,因此,MMX CPU极大地提高了电脑的多媒体(如立体声、视频、三维动画等)处理功能。
有CUDA、OpenCL(全称Open Computing Language,开放运算语言)和微软的DirectX 11 .
固定内存技术,其作用是固定内存技术的实质是强制让系统在物理内存中完成内存申请和释放的工作,不参与页交换,从而提高系统效率。
(1) 启动CUDA,使用多卡时加上设备号,或者使用cudaDevice()设置GPU装置。
(2) 分别在CPU和GPU端分配内存,用以储存输入输出数据,CPU端要记得初始化数据,然后将数据拷入显存。
(3)调用device端的kernel程序计算,将结果写到显存相关区域,再回写到内存。
(4)利用CPU进行数据其他处理,释放内存和显存空间。
(5)退出CUDA装置
是cutil.h中的两个宏函数,分别用来启动和退出CUDA环境。
调用后的返回值为cudaerr型,用CUT_CHECK_ERROR()宏函数可以接受最后一次的cudaerr_t异常,如果发生异常将输出错误类型,对调试很有帮助,cudaerr_t是定义在toolkit里的\include\drive_types.h中。
<<<Dg,Db,Ns,S>>>
1)Dg用于定义整个grid的维度和尺寸,为dim3型。最多为二维,Dg.x和Dg.y最大为65535,整个grid中最多也只能定义65535个block,例如:Dg(Dg.x,Dg.y,1)。
2)Db用于定义每个block的维度和大小,也是dim3型。Db.x和Db.y最大为512,Db.z最大为4,三个维度之积小于768(计算能力为1.0,1.1的硬件)或1024(计算能力为1.2,1.3的硬件).例如:Db(Db.x,Db.y,Db.z)
3)Ns是一个可选参数,用于设置每个block除了静态分配的sharedmemory外,最多能动态分配的sharedmemory,单位是Byte。目前的硬件最多每个block分配16KB的sharedmemory(静态+动态)。不需要时可写0或省略。
4) S是一个cudaStream_t类型的可选参数,初始值为0.
实际在代码编写的时候,<<<>>>参数只需要填写两个,分别BLCOKNUM(block数量)和每个block中的线程数THREADNUM。
看过CUDA程序的都知道啊,进行一次GPU计算,需要在多个存储器之间进行数据传输,因此有较大的延迟,故GPU不适合对实时性要求很高的应用。由于不同存储器间的数据传输速率和使用方法有很大差异,故开发人员需要根据硬件特点设计并行算法。
到目前为止,我觉得最难的地方就是要根据任务以及硬件的特性对任务进行划分,以设计block的工作流程,既要照顾到数据传输的问题同时要隐藏各种访存延迟。
在_device_和_global_函数中表示动态分配,而在主机端正如C语言所描述的一样,只是表示外部变量。
注意:通过这种方式定义的所有变量都是开始于同一地址,因此数组中的变量布局必须通过偏移量显式管理。
如要在动态分配的共享存储器中得与下代码对应内容:
short array0[128];
float array1[64];
int array2[256];
应该按照如下方式定义:
extern_shared_char array[];
_device_voidfunc()//_device_or_glabol_function
{
short*array0=(short*)array;
float*array1=(float*)array0[128];
int*array2=(int*)array1[64];
}
OpenMp是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive)。
在CUDA中,GPU端(release和debug模式下的_global_和_device_函数)只能使用自带的数学库函数。
说明:有前缀“_”的函数根据SP(标量流处理器)特点进行了优化,可获得更高的速度,但是有前缀“_”的整数程序只能处理24位整数,有前缀“_”的浮点数精度较不带该前缀的版本精度要差一些。
GeForce(Geometry Force,几何力量,精视)芯片系列显卡,NVIDIA公司出品的显示芯片的一种系列。用于竞争AMD的Radeon系列显卡,定位于PC个人领域,提供家庭娱乐。
Quadro芯片系列显卡,Quadro系列定位于专业绘图工作站领域,强调与行业软件的兼容性、稳定性以及高效率。
Tesla是一个新的显示核心系列品牌,主要用于服务器高性能电脑运算,用于对抗AMD的流处理器(FireStream)。这是继GeForce和Quadro之后,第三个显示核心商标。NVIDIA将显示核心分为三大系列,Tesla主要用于大规模的并联电脑运算。
ATI显示芯片生产商已被AMD收购。生产的芯片系列有:
Radeon(镭™):是AMD公司出品的显示芯片的一种系列。俗称A卡。
AMD FirePro:(又称ATI FirePro),是由ATI 开发的显示芯片。由ATI FireGL和ATI FireMV合并而来,现由AMD开发推广。AMD FirePro 定位于专业领域,其主要竞争对手为NVIDIA Quadro系列。
SM(Stream Multiprocessor)流多处理器,即GPU的核心数,就是cuda core。一个完整处理核心必须包括取值、解码、分发逻辑和执行单元。
SP(Stream Processor)标量流处理器,是SM的执行单元,不是完整的处理核心。一个SP由一个branch单元和一个ALU/MAD(Arithmetic Logic Unit算数逻辑运算单元,MAD是Multiply-Add-Unit乘加器)。
关系:CUDA编程硬件映射时,一个Grid(线程网格)对应一个流处理器阵列 Scalable Streaming Processor Array (SPA),也就是对应一个GPU;一个Block(线程块)对应一个SM,一个Thread(线程)对应一个SP。
注意:在实际运行时,一个Block会被分割为数个warp(线程束),warp才是真正的执行单元。
硬件层:每个SPA 包含若干 TPC,每个TPC包含2~3个SM,每个SM包含8个SP。其中TPC是线程处理器群 Thread Processing Cluster。
CUBLAS (CUDA Basic Linear Algebra Subprogram) 是线性计算的函数库。
对于计算能力1.x,Block和Grid各维度的最大值:
block-bx <= 512,block-by <= 512,block-bz <= 64。grid-gx <= 65535,grid-gy <= 65535,每个block中的最大线程数量为512。
对于计算能力2.x,Block和Grid各维度的最大值:block-bx <= 1024,block-by<=1024,block-bz <= 64。grid-gx <= 65535,grid-gy <= 65535,每个block中的最大线程数量为1024。
详见http://www.guandang.com/ppt/817048.html。