赞
踩
本节书摘来自华章计算机《高性能科学与工程计算》一书中的第1章,第1.6节,作者:(德)Georg Hager Gerhard Wellein 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
从Cray 1超级计算机开始,直到基于RISC的高度并行计算机出现之前,向量机一直占据着科学计算的主要领域。在写这本书时,只有两家公司还在制造和销售向量机。但因为对内存带宽和运行时间有高度需求,向量机还是有着一个充满商机的市场。
根据设计,对于合适的可向量化的代码,向量处理器相较于标准的微处理器可以达到一个较好的实际性能。这种设计遵循单指令多数据(SIMD)的范例,即一条简单的机器指令被自动地应用于很多类型相同的参数。许多现代的基于cache的微处理器以扩展SISD指令集的形式采用这些技术(细节参考2.3.3节)。而且向量机在执行单元和存储子系统上有大量的并行操作。
1.6.1 设计原理
现代向量处理器与RISC设计非常像,都是寄存器—寄存器型的机器:机器指令运行在向量寄存器上,每个向量寄存器存储长度在64~256(双精度)之间的一些参数。向量寄存器的宽度称为向量长度Lv。对于每一种算术运算,像加法、乘法、除法等都分别有一条流水线,每一条流水线在每个指令周期都可以得到一定数目的结果。对于乘法和加法流水线来说,得到2~16个结果,这也称作多轨流水线(multitrack pipeline)(参考图1-21)。其他像平方根和除法操作比较复杂,流水线的输出要低很多。但是即使只有单一流水线的向量处理器也可以达到基于cache的超标量微处理器相同的峰值性能。为了向向量寄存器提供数据,有一个或者多个直接跟主存相连的读取、存储、读取与存储相结合的流水线。尽管最近像NEC SX-9的设计引进了容量小的片上存储,但传统的向量CPU没有缓存层次的概念。
为了在向量CPU上获得合理的性能,必须采用SIMD类型的指令。我们来看一个简单的例子,有两个数组A(1 : N?) = B(1 : N?) + C(1 : N?)。在一个基于cache的微处理器上,这个运算最终的实现是在A、B和C上的一个循环(可能会软流水),对于每一次计算,必须要执行两次读取操作、一个加操作和一个存储操作,并且还必须有整型和分支逻辑来实现循环。如果数组的长度比寄存器长度短,则向量CPU可以对于整个数组使用一条指令:
整个过程的性能瓶颈很显然是LD/ST流水线。如果给予合适的代码,硬件能够在相同时间内执行4倍的乘法和加法指令(图1-22中浅灰色菱形),所以代码清单1-1的性能只能达到峰值性能的25%,在上面描述的向量处理器上性能为4 GFlop/s,这与图1-4中的SX-8 N很大时的曲线完全吻合。需要注意的是,由于向量系统上有很大的内存延迟,所以这个限制只对相对大的N值可以达到。另外,除了不可向量化的代码,短循环是第二大影响这些结构的性能因素。
1.6.3 程序设计
向量化的必要条件是在循环的迭代之间不存在真数据相关。软流水(见1.2.3节)也同样不能出现真数据相关,例如允许向前引用(forward reference)但是向后引用(backward reference)会影响向量化。更精确地讲,真相关的位移间隔必须大于某一阈值(至少是向量的长度,有时更大),这样前面向量操作的结果才会是可用的。
因为与“单条指令”的编程规范冲突,内部循环中的分支也会影响向量化。但是我们有一些方法来支持向量化循环中的分支:
编译器会自动执行向量化操作(可能是源代码直接支持向量化)或者代码被重写使得可以显式地使用临时数组来保存所需的向量数据。还有另一种替代方案,使用列表向量,它是一个整型的向量数组,保存着条件为真的索引,通过间接访问,这些索引可以用来重构原始循环。
由于cache行的概念,基于cache处理器对gather/scatter操作开销非常大,而向量处理器能更经济地执行(即使跨度为1的访存模式更有效)。
关于向量结构的编程和优化可以从生产商处获得更多参考文档[V110,V111]。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。