文章目录
- 2.1 CPU配置
- 本节及随后两:各种 CPU/GPU架构,
- 2-1省略连接 CPU与外界的“芯片组”(“核心逻辑”)。
- 每个Pcle (peripheral communications interconnect express) 2.0的lane
- 2.1.1 前端总线
- 2.1.2对称处理器簇
- 2.1.3 NUMA
- 对开发人员,2-4中和讨论过的略有不同。
- 对配有多个CPU的机器,此架构意味,每个CPU都有自己的内存带宽池。
- HT和QPI是CPU间、CPU与I/O集线器的点对点连接。
- 为帮助解决这些性能陷阱,
- 爱钻研的人可用这些API来设计代码以暴露NUMA的性能缺陷。
- 减轻访问非本地内存对性能影响的方法之一,是以缓存行边界为准,在CPU间均匀划分物理内存,也就是所谓的内存重叠。
- 为很好地运行在这样一个“亲和”系统上,CUDA程序注意 NUMA API 的使用,以便为连接到给定GPU的PCIe总线执行本地的内存分配和线程亲和的调度。
- 2.1.4 集成的PCle
- 2.2集成GPU
- “集成”的意思是“集成到芯片组”。
- CUDA中用于映射锁页内存( mapped pinned memory)的API,在集成GPU上有特殊意义。
- “写结合”( write- combined,WC)内存的分配在集成GPU上也有大意义。
- 集成与独立不排斥的。
- CUDA程序通过cudadeviceprop.integrated的值或
- 集成GPU不稀奇,计算机在主板上集成了支持CUDA的GPU。
- 2.3多GPU
- 本章从GPU的系统层面到功能单元对CUDA平台描述。
- 前三:多种构建CUDA系统的方法;
- 四:地址空间及CUDA的内存模型是如何在软硬件上实现的;
- 五:CPU/GPU交互,指令如何提交到GPU及CPU/GPU是同步的;
- 最后,针对复制引擎和流处理器簇等功能单元进行宏观描述,
- 给出了支持CUDA的三代硬件上流处理器簇的框图。
2.1 CPU配置
本节及随后两:各种 CPU/GPU架构,
- 对CUDA开发者 如何编程 给建议。
- 研究了CPU配置、集成GPU和多GPU配置。
- 从图2-1谈起。
2-1省略连接 CPU与外界的“芯片组”(“核心逻辑”)。
- 系统每比特的入与出:磁盘、网络控制器、键、鼠、USB设备及GPU的输入输出,都要过芯片组。
- 谁一分为二:
- 连接大多外设和系统的
- 含图形总线(加速图形端口,后被PCle接口取代)和
- 内存控制器(通过前端总线与内存相连)的
每个Pcle (peripheral communications interconnect express) 2.0的lane
- 理论500MB/s带宽。
- 一给定外设,通道数1、4、8或16
- GPU需平台上所有外设的最大带宽,所以它们一般被插由16通道的PCe插槽。
- 考虑到数据包的附加消耗,8G/s带宽实际上能达6G/s
2.1.1 前端总线
- 2-2将北桥和内存控制器添加到2-1后的简化。
- 2-2还显示GPU的集内
- 是在与CPU内存控制器完全不同的约束集下设计的。
- G须调解所谓的同步客户端,如视频显示,其带宽要求是固定的。
- G内在设计时还考虑了GPU对延迟的容忍度
- 及大量内存带宽方面的内在需求。
- 写书时高端G提供的本地显存带宽>>超过100G/s。
- G内总和G集成
- so本章其余的图省略了它
- so本章其余的图省略了它
2.1.2对称处理器簇
-
2-3:传统北桥配置上的多CPU系统。
-
多核前,用多线程以利用多CPU
-
即使每个CPU和北桥本身都有缓存,
- 北桥也须确保每个CPU看到相同的、一致的内存视图。
-
SMP共享通往内存的路径,不同CPU的内存访问性能一致。
-
PCI3.0带宽PCle2.0两倍。
-
供图2-3,不只是因为该配置是支持CUDA的计算机,
- 更是作为历史资料参照。
2.1.3 NUMA
- AMD的Opteron到Intel的Nehalem(酷睿i7)谈起,
- 北桥的内集成到CPU,如2-4。
- 这提高了CPU的内存性能。
对开发人员,2-4中和讨论过的略有不同。
- 对包含多个CPU的系统,如图2-5,就很不一样。
对配有多个CPU的机器,此架构意味,每个CPU都有自己的内存带宽池。
- 这样的系统中,CPU称“节点”或“CPU插槽”。
- 同时,由于多线程OS和程序依赖于前文中CPU和北桥配置下缓存的一致性,Opteron和Nehalem架构推出HT和QPI
HT和QPI是CPU间、CPU与I/O集线器的点对点连接。
- HT/QPI的系统中
- 每个CPU都可访问任何内存存储单元。
- 但对内存的物理地址直接附属于CPU的本地内存单元的访问会更快。
- “非本地访问”的执行有赖于HT/QPI检查其他CPU的缓存,清除所
请求数据的缓存副本,然后传递数据到发出请求的CPU。 - 这些CPU的大型片上缓存降低非本地内存访问的成本。
- 且,发出请求的CPU可在自身缓存层次上保留该数据,直到另一个CPU向内存提出申请为止。
为帮助解决这些性能陷阱,
- Windows和Linux引入API。
- 这样应用程序能够用特定CPU以及设置“线程亲和的”( thread affinity)CPU。
- 因此,当OS把线程调度到CPU时,可保证大部分甚至是全部的内存都是本地访问的。
爱钻研的人可用这些API来设计代码以暴露NUMA的性能缺陷。
- 更常见(和隐性)的问题是,由于运行在不同CPU上的两个线程的“伪共享”,导致过多的HT/QPI事务在同一缓存行上访问内存存储单元。
- so NUMA API须慎用。
- 它们虽然提供了提高性能的工具,但也容易因误用而带来性能问题。
减轻访问非本地内存对性能影响的方法之一,是以缓存行边界为准,在CPU间均匀划分物理内存,也就是所谓的内存重叠。
- 对CUDA而言,此法在图2-5所示的系统中很有效(其为一个NUMA模式配置,多CPU和GPU通过一个共享的I/O集线器连接)。
- 由于PCle带宽往往是整体应用性能的瓶颈,许多系统将使用独立的I/O集线器去服务更多的PCIe总线,如图2-6
为很好地运行在这样一个“亲和”系统上,CUDA程序注意 NUMA API 的使用,以便为连接到给定GPU的PCIe总线执行本地的内存分配和线程亲和的调度。
- 否则,GPU发起的内存复制将是非本地的,内存事务将在HT/QPI互连结构中需要额外的“跳跃”。
- 由于GPU要巨大的带宽,这些DMA操作会降低HT/QPI为其主要对象服务的能力。
- 和伪共享相比,对于CUDA程序而言,GPU的非本地内存复制操作对性能的影响有更要命。
2.1.4 集成的PCle
- 2-7将I/O集线器集成到CPU,沙桥是迈向全面的系统集成的又一步。
- 单沙桥的PCIe接口有40通道(一个GPU最多用16,so支持两个GPU)。
对CUDA开发者,集成的PCIe有利有弊。
- 弊:PCIe通路始终是亲和的。
- 设计师不能建立单一I/O集线器服务于多个CPU(即2-5所示)
- 所有的多CPU系统都类似于图2-6。
导致不同CPU上的GPU之间无法执行点对点操作。
- 所有的多CPU系统都类似于图2-6。
- 优:CPU缓存可直接参与PCle总线通信:DMA读请求可直接读取缓存,且GPU写入的数据会放入缓存
2.2集成GPU
“集成”的意思是“集成到芯片组”。
- 如2-8,只属于CPU的内存池可被集成到芯片组的CG共享。
- 如,英伟达芯片组中支持CUDA的GPU,MCP79(适用于笔记本电脑和上网本)和MCP89等。
- MCP89将是最新最好的支持CUDA的x86芯片组,
- 集成了三级缓存,
- 有3倍于MCP7x芯片组的流处理器簇。
CUDA中用于映射锁页内存( mapped pinned memory)的API,在集成GPU上有特殊意义。
- 这些API把分配的主机内存映射到CUDA内核的地址空间,使它们能直接被访问。
- 也称“零复制”,因为内存是共享的,复制不需过总线。
- 在传输受限型工作量上,集成的GPU可超过一个大的独立G
“写结合”( write- combined,WC)内存的分配在集成GPU上也有大意义。
- CPU的缓存侦测行为在访问这种内存时是被禁止的,这样可以提高访问内存过程中GPU的性能。
- 当然,若CPU从“写结合”内存中读数据,通常的WC内存应用的性能会有损失。
集成与独立不排斥的。
- MCP7x和MCP89芯片组提供了PCIe连接接口(图2-9)。
- 在这样的系统中,CUDA更倾向于在独立GPU上运行,因为大多数的CUDA
应用程序将在独立GPU上部署。 - 如,在单个GPU上运行时,一个CUDA应用程序会自动选择在独立GPU上运行。
CUDA程序通过cudadeviceprop.integrated的值或
- 通过传递CU_DEVICE_ATTRIBUTE_INTEGRATED到cuDeviceGetAttribute()査询一个GPU是集成GPU?。
集成GPU不稀奇,计算机在主板上集成了支持CUDA的GPU。
- 几年内会落伍,因为英伟达已退出x86芯片组市场。
- 传言已宣布出货重点放在
- 集成了支持CUDA的GPU与 ARM CPU的
- 片上系统( systems on a chip,SOC)上。
- 可判定,零复制优化将在那些系统上工作得很好。
2.3多GPU
- 把多GPU安装在一个系统的不同方法及其对CUDA开发者的影响。
- 会从下图略去GPU内存。
- 图中,每个GPU默认连接到相应专用内存。
约2004年,英伟达推出了“速力”( Scalable Link Interface,SL)技术,
- 可让多GPU并行工作,以提供更高的图形性能。
- 使用可容纳多个GPU的主板,用户可通过在他们的系统上安装两个GPU来提升近一倍的图形性能(图2-10)。
- 默认情况下,英伟达驱动程序配置了这些GPU卡,使它们表现得好像是单个速度更快的卡,用以加速如 Direct3D和OPENGL GPU的图形API。
- 打算用CUDA的用户,必须明确在 Windows的显示控制面板上启用它。
here!!!