AMD OpenCL大学课程(6)

GPU架构

内容包括:

1.OpenCLspec和多核硬件的对应关系

  • AMD GPU架构
  • Nvdia GPU架构
  • Cell Broadband Engine

2.一些关于OpenCL的特殊主题

  • OpenCL编译系统
  • Installable client driver

 

首先我们可能有疑问,既然OpenCL具有平台无关性,我们为什么还要去研究不同厂商的特殊硬件设备呢?

  • 了解程序中的循环和数据怎样映射到OpenCL Kernel中,便于我们提高代码质量,获得更高的性能。
  • 了解AMD和Nvdia显卡的区别。
  • 了解各种硬件的区别,可以帮助我们使用基于这些硬件的一些特殊的OpenCL扩展,这些扩展在后面课程中会讲到。

3、传统的CPU架构

  • 对单个线程来说,CPU优化能获得最小时延,而且CPU也适合处理控制流密集的工作,比如if、else或者跳转指令比较多的任务。
  • 控制逻辑单元在芯片中占用的面积要比ALU单元多
  • 多层次的cache设计被用来隐藏时延(可以很好的利用空间和时间局部性原理)
  • 有限的寄存器数量使得同时active的线程不能太多。
  • 控制逻辑单元记录程序的执行、提供指令集并行(ILP)以及最小化CPU管线的空置周期(stalls,在该时钟周期,ALU没做什么事)。
    4、现代的GPGPU架构

     

    • 对于现代的GPU,通常的它的控制逻辑单元比较简单(和cpu相比),cache也比较小
    • 线程切换开销比较小,都是轻量级的线程。
    • GPU的每个“核”有大量的ALU以及很小的用户可管理的cache。
    • 内存总线都是基于带宽优化的。150GB/s的带宽可以使得大量ALU同时进行内存操作。

    5、AMD GPU硬件架构

    现在我们简单看下AMD 5870显卡(cypress)的架构

    • 20个simd引擎,每个simd引擎包含16个simd。
    • 每个simd包含16个stream core
    • 每个stream core都是5路的乘法-加法运算单元(VLIW processing)。
    • 单精度运算可以达到 Teraflops。
    • 双精度运算可以达到544Gb/s

    上图为一个simd引擎的示意图,每个simd引擎由一系列的stream core组成。

    • 每个stream core是一个5路的VLIW处理器,在一个VLIW指令中,可以最多发射5个标量操作。标量操作在每个pe上执行。
    • CU(8xx系列cu对应硬件的simd)内的stream core执行相同的VLIW指令。
    • 在CU(或者说simd)内同时执行的work item放在一起称作一个wave,它是cu中同时执行的线程数目。在5870中wave大小是64,也就是说一个cu内,最多有64个work item在同时执行。

    注:5路的运算对应(x,y,z,w),以及T(超越函数),在cayman中,已经取消了T,改成四路了。

 

我们现在看下AMD GPU硬件在OpenCL中的对应关系:

  • 一个workitme对应一个pe,pe就是单个的VLIW core
  • 一个cu对应多个pe,cu就是simd引擎。

上图是AMD GPU的内存架构:

  • 对每个cu来说,它使用的内存包括onchip的LDS以及相关寄存器。在5870中,每个LDS是32K,共32个bank,每个bank 1k,读写单位4 byte。
  • 对每个cu来说,有8K的L1 cache。(for 5870)
  • 各个cu之间共享的L2 cache,在5870中是512K。
  • fast Path只能执行32位或32位倍数的内存操作。
  • complete path能够执行原子操作以及小于32位的内存操作。

AMD GPU的内存架构和OpenCL内存模型之间的对应关系:

  • LDS对应local memeory,主要用来在一个work group内的work times之间共享数据。steam core访问LDS的速度要比Global memory快一个数量级。
  • private memory对应每个pe的寄存器。
  • constant memory主要是利用了L1 cache

注意:对AMD CPU,constant memory的访问包括三种方式:Direct-Addressing Patterns,这种模式要求不包括行列式,它的值都是在kernel函数初始化的时候就决定了,比如传入一个固定的参数。Same Index Patterns,所有的work item都访问相同的索引地址。Globally scoped constant arrays,行列式会被初始化,如果小于16K,会使用L1 cache,从而加快访问速度。

当所有的work item访问不同的索引地址时候,不能被cache,这时要在global memory中读取。

 

 

时间: 2024-07-31 13:29:55

AMD OpenCL大学课程(6)的相关文章

AMD OpenCL大学课程(2)

1.OpenCL架构       OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其它处理器,比如Cell处理器,DSP等.使用OpenCL编程,可以实现可移植的并行加速代码.[但由于各个OpenCL device不同的硬件性能,可能对于程序的优化还要考虑具体的硬件特性].    通常OpenCL架构包括四个部分: 平台模型(Platform Model) 执行模型(Execution Model) 内存模型(Memory Model) 编程模型(Programming

AMD OpenCL大学课程(5)

OpenCL内存模型     OpenCL的内存模型定义了各种各样内存类型,各种内存模型之间有层级关系.各种内存之间的数据传输必须是显式进行的,比如从host memory到device memory,从global memory到local memory等等.     WorkGroup被映射到硬件的CU上执行(在AMD 5xxx系列显卡上,CU就是simd,一个simd中有16个pe),OpenCL并不提供各个workgroup之间的一致性,如果我们需要在各个workgroup之间共享数据或

AMD OpenCL大学课程(7)

6.Nvdia GPU Femi架构 GTX480-Compute 2.0 capability: 有15个core或者说SM(Streaming Multiprocessors ). 每个SM,一般有32 cuda处理器. 共480个cuda处理器. 带ECC的global memory 每个SM内的线程按32个单位调度执行,称作warp.每个SM内有2个warp发射单元. 一个cuda核由一个ALU和一个FPU组成,FPU是浮点处理单元. SIMT和SIMD SIMT是指单指令.多线程. 硬

AMD OpenCL大学课程(11)

性能优化 1.线程映射    所谓线程映射是指某个线程访问哪一部分数据,其实就是线程id和访问数据之间的对应关系. 合适的线程映射可以充分利用硬件特性,从而提高程序的性能,反之,则会降低性能.    请参考Static Memory Access Pattern Analysis on a Massively Parallel GPU这篇paper,文中讲述线程如何在算法中充分利用线程映射.这是我在google中搜索到的下载地址:http://www.ece.neu.edu/~bjang/pat

AMD OpenCL大学课程(12) 性能优化案例NBody

    本节主要介绍NBody算法的OpenCL性能优化. 1.NBody     NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统.每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果.      上图为一个粒子模拟星系的图片:Source: THE GALAXY-CLUSTER-SUPERCLUSTER CONNECTION,http://www.casca.ca/ecass/issues/1997-DS/West/west-bil.html    由于每个粒子之间都

AMD OpenCL大学课程(10)

GPU线程及调度      本节主要讲述OpenCL中的Workgroup如何在硬件设备中被调度执行.同时也会讲一下同一个Workgroup中的workitem,如果它们执行的指令发生diverage(就是执行指令不一致)对性能的影响.学习OpenCL并行编程,不仅仅是对OpenCL Spec本身了解,更重要的是了解OpenCL硬件设备的特性,现阶段来说,主要是了解GPU的的架构特性,这样才能针对硬件特性优化算法.现在OpenCL的Spec是1.1,随着硬件的发展,相信OpenCL会支持更多的并

AMD OpenCL大学课程(13) OpenCL扩展

1.OpenCL扩展      OpenCL扩展是指device支持某种特性,但这中特性并不是OpenCL标准的一部分.通过扩展,厂商可以给device增加一些新的功能,而不用考虑兼容性问题.现在各个厂商在OpenCL的实现中或多或少的使用了自己的扩展.      扩展的类型分为三种: Khronos OpenCL工作组批准的扩展,这种要经过一致性测试,可能会被增加到新版本的OpenCL规范中.这种扩展都以cl_khr作为扩展名. 外部扩展, 以cl_ext为扩展名.这种扩展是由2个或2个以上的

AMD OpenCL大学课程(4)

Kernel对象:     Kernel就是在程序代码中的一个函数,这个函数能在OpenCL设备上执行.一个Kernel对象就是kernel函数以及其相关的输入参数.   Kernel对象通过程序对象以及指定的函数名字创建.注意:函数必须是程序源代码中存在的函数. 运行时编译:     在运行时,编译程序和创建kernel对象是有时间开销的,但这样比较灵活,能够适应不同的OpenCL硬件平台.程序动态编译一般只需一次,而Kernel对象在创建后,可以反复调用.   创建Kernel后,运行Ker

AMD OpenCL大学课程(3)

OpenCL内存对象:       OpenCL内存对象就是一些OpenCL数据,这些数据一般在设备内存中,能够被拷入也能够被拷出.OpenCL内存对象包括buffer对象和image对象. buffer对象:连续的内存块----顺序存储,能够通过指针.行列式等直接访问. image对象:是2维或3维的内存对象,只能通过read_image() 或 write_image()来读取.image对象可以是可读或可写的,但不能同时既可读又可写.        该函数会在指定的context上创建一个