CUDA 架构构建在一个可伸缩的多线程流处理器(Streaming Multiprocessors ,SM)之上。当主机 CPU 上的 CUDA 程序调用内核网格时,网格的块将被枚举并分发到具有可用执行容量的多处理器上。一个线程块的线程在一个多处理器上并发执行。在线程块终止时,将在空闲多处理器上启动新块。
局部内存空间和全局内存空间不会缓存,这意味着每次对全局内存(或局部内存)进行访问都将导致一次实际的内存访问。那么访问(例如读取或写入)各种类型的内存的开销是多少?
CUDA开发人员面临的最重要的性能挑战之一就是如何充分利用本地多处理器内存资源,如共享内存、常量内存,以及寄存器。原因就是我们上一篇文章中讨论的,虽然全局内存可以提供超过60 GB/秒的速度,但这对于只获取使用一次的数据来说,仅相当于15gf/秒――要获得更高的性能则要求能够重用本地数据。CUDA软件和硬件设计师做了一些出色的工作,以隐藏全局内存的延迟和全局内存的带宽限制――但这都是以本地数据重用为前提的。
CUDA的编译器为nvcc,nvcc将各种编译工具集成起来,这些编译工具实现了编译的不同阶段。nvcc的基本工作流是将device代码从host代码中分离出来,然后将其编译成二进制或者cubin工程。在执行过程中,将忽略host代码,而将device代码加载并通过CUDA的设备API来执行。
目前 NVIDIA 提供的 CUDA Toolkit支持 Windows (32 bits 及 64 bits 版本)及许多不同的 Linux 版本。
在使用CUDA进行GPGPU计算时,global + shared的黄金组合在速度上远远超过了texture,只有在以下两种情况下使用texture。
访问global虽然仍然需要最多数百个时钟周期,但是总的来说比cpu的内存还是快多了...如果使用得当的话。CUDA是符合SIMD-PRAM模型的,也就是n台功能相同的处理机(block看成处理机,每个thread看成处理机的一部分更好些),一个容量无限大的共享处理器M。其中M就是global memory,虽然在CUDA中也是有限的,但是比起可怜的shared还是多很多了。
纹理可以在线性内存或是CUDA数组(纹理内存)的任何区域。所以纹理拾取也就对存在与线性内存或CUDA数组中的纹理读取数据。
日前,作为中国国产品牌服务器市场老大的浪潮发布了业界首款万亿次桌面超级计算机——“倚天”。与去年曙光发布的所谓个人HPC不同的是,浪潮的“倚天”的运算速度更快,价格更便宜。而这一切的根本是源于其采用了NVDIA开发的Tesla的CPU+GPU的异构多核架构。
这个是个典型的利用 shared memory 来使内存读写加速的例子, CUDA SDK 中有个 transpose_native, 是采用比较原始的办法, 将每列的第一个元素读出来凑成一行, 这个办法显而易见是比较的慢的,比上面这个程序要慢10倍以上.
创建DLL,首先从CUDA SDK里面拿出来一个源文件中只有一个.cu文件的项目,例如:cudaOpenMP。修改项目的lib目录设定,加入CUDA SDK的目录。
如果想建立一个完全使用CUDA的程序,那么下载http://sourceforge.net/projects/cudavswizard/这个就可以了,但是很多时候对于大型工程,主要还是以c或者cpp代码为主,只是在需要性能优化的地方使用CUDA代码,这个时候需要一点点小知识来实现CUDA和VC8的混合编译.步骤如下。
CUDA 是 Compute Unified Device Architecture “统一计算构架” 的简写,很多人都认为Photoshop cs4支持native的cuda 是错误的.
CUDA Stream processor 里的运算单元,基本上是一个浮点数的 fused multiply-add 单元,也就是说它可以进行一次乘法和一次加法
CUDA的nvcc编译器支持数据结构struct的对齐,以此来提高速度。但当我们想从C++里创建数据结构,然后传到GPU里,用GPU处理的时候,我们就必须注意这个对齐了,怎么在C++里模拟CUDA的对齐呢?今天我发现,其实,结构的内存对齐并不是nvcc的魔法,nvcc其实也只是使用了C++的对齐机制。但为什么要多出一个__align__关键字呢?原来,C++的结构对齐并不是一个跨平台的标准,所以nvcc用__align__来统一。
OpenCL是一个开放的国际标准,可以用来在不同架构的CPU, GPU使用统一的接口来编程, 包括了编程语言, API接口, 运行时库. 最大的好处,也是我最喜欢的特性,就是可以写出高效的可移植代码.简单的说,过去你用CUDA写的代码就只能在Nvidia的卡上跑,StreamSDK写的代码就只能在ATI的卡上跑,但是有OpenCL,你就不用这么烦恼了,nvidia, ati, intel的GPU都可以通吃了.
CUDA 目前有兩種不同的 API:Runtime API 和 Driver API,兩種 API 各有其適用的範圍。由於 runtime API 較容易使用,一開始我們會以 runetime API 為主。
這裡我們會簡單介紹,NVIDIA 目前支援 CUDA 的 GPU,其在執行 CUDA 程式的部份(基本上就是其 shader 單元)的架構。這裡的資料是綜合 NVIDIA 所公布的資訊,以及 NVIDIA 在各個研討會、學校課程等所提供的資料,因此有可能會有不正確的地方。主要的資料來源包括 NVIDIA 的 CUDA Programming Guide 1.1、NVIDIA 在 Supercomputing '07 介紹 CUDA 的 session,以及 UIUC 的 CUDA 課程。
目前 NVIDIA 提供的 CUDA Toolkit(可從這裡下載)支援 Windows (32 bits 及 64 bits 版本)及許多不同的 Linux 版本。