此文是写给论坛的写给论坛的大鸟小鸟看的~!最近AMD在推APU异构运算,哥我看了只能一笑置之。AMD的异构运算相对于虽然已成概念,不过在应用方面却迟迟不见有什么突破。NV方,就比较成熟鸟。哥还记得有个小鸟曾经问NV的工程师,A卡可不可以运行CUDA程序。工程师说,如果A卡的向量阵列中,也拥有可编程的高速缓冲就可以扫去一切难题。这个缓存是什么可以跟帖问哥,下文也有提及的。 为了你能看懂下文,你大爷我给你解析一下: 1.Thread指的是一个线程,它是最基本的执行单位; 2.Block指的是一组合作进程的集合,它们可以通过shared memory通信; 3.Grid指的是一个内核函数的线程总和,它由block块组成; 4.Warp指硬件层的线程并行度,也就是说指令的并行宽度,NVIDIA为了上下兼容硬件因此一般取值为32; 5.原子操作:视为一个不可分割的操作,作用是防止多线程的读写冲突 1. GT200架构:代表显卡GTX 280 GT200为NVIDIA通用架构的第一次变化,和图形架构不同,GPU内部的渲染单元摇身一变成为了通用的运算单元。GT200一共具备了240个CUDA核心,在底层组成上每个SM阵列是一个拥有8个CUDA核心的单指令多数据流单元。因此,每条指令可以控制32个单元(因为每次执行的周期时为4个周期,因此8个物理单元正好是4×8=32)。 GT200通用计算架构 2. Fermi架构代表显卡 GTX580 Fermi主要是内置CUDA核心得到了大幅提高,达到了512个。同时存储结构也得到了优化。在实现上由于需要兼容以往的硬件,因此指令宽度依然保持为32。物理的SM为32个CUDA核心,不过由于保持了双warp的调度器,因此如果保留32单个warp的宽度就可以让每个向量机阵列实现更多的激活线程块,从而提高执行效率。 Fermi通用运算架构 Histogram直方图测试 直方图算法是图像处理中一个最基本的运算。它的作用是把色阶相同的像素做统计分析。在图像处理中的直方图纵坐标一般是数量,横坐标为色阶也就是亮度值。CPU算法是依靠循环逐次计算每个像素的色阶值,然后用数组记录统计数量最后用于显示。 CUDA的并行实现分为先把整个图像在空间域上通过block分解到不同的合作线程块当中。每个block中的thread并行算出每个小块图像的统计值,最后由block来并行算出。此测试过程block内需要原子加操作,block之间需要DRAM原子加操作。因此可以检验Fermi体系中原子操作的提速。 测试程序调用两个内核函数,一个为多个block并行处理切割的图像,另一个为单block函数来并行处理色阶数值。值得注意的是G80架构并不支持shared memory上的原子操作,因此G80架构的显卡只能在在一个block内实现单线程。 计算每个像素来表达色阶函数 |