我曾经终日坐在用龙芯2号做的计算机前, 玩着各种游戏, 使用各种重量级的软件来感受龙芯2号的性能。 虽然对于有些大型的应用软件还感到有些迟钝, 但我们的龙芯2号已经明显表现出她作为PC机中使用的CPU的资格和风范。 每当我在龙芯2号上玩着LINUX PC中的各种游戏, 想想一年前玩龙芯1号时觉得性能不理想时的郁闷心情, 真是我这一年来最爽的体验。
龙芯2号的性能提高主要来自先进的结构设计, 包括四发射和乱序执行结构的设计。 而乱序执行的关键技术是龙芯2号结构设计的重点和难点, 四发射的RISC结构如果没有乱序执行技术的支持是发挥不出效率的。 例如典型的定点程序中平均每六、七条指令就有一条转移指令, 意味着在四发射结构中每两拍就有一条转移指令。 如果等转移指令的目标地址确定再进行后面的取指, 意味着每取两拍指令就得等五、六拍甚至更多才能继续后面的取指。 又如, 做一个简单的加法需要两个操作数, 而如果这两个操作数都需要从内存中 (即主板上的内存条) 取回来, 那么在做这个加法之前, 需要至少上百拍的时间为这个加法准备数据。 指令乱序执行的核心思想就是减少各种相关引起的等待, 充分发挥处理器的效率。
主要做法包括:(1) 转移猜测, 即在转移指令目标尚未确定的时候, 根据过去转移指令执行的历史猜测该转移指令的转移方向和转移目标,并根据猜测的结果进行后续指令的取指, 为处理器提供连续稳定的指令流。 如果最后发现猜测错误, 则取消猜错的转移指令后面的指令。 (2) 动态调度, 即在前面的指令由于操作数未准备好而等待时, 后面的操作数已经准备好的指令可以越过前面的指令先执行。 (3) 寄存器重命名, 即指令运算后先写到一个临时的寄存器, 等确定该指令不会被取消后再写到真正的目标寄存器中去。 这样做的好处除了便于前面指令发生例外或转移猜错时取消外, 还避免了由于两条指令写同一个寄存器时的等待。
此外, 访存指令的乱序执行又有新的特征。 除了通过增大CACHE和对CACHE进行有效的组织尽量提高CACHE命中率并降低CACHE访问的延迟外, 还需要对访存指令进行乱序执行以提高效率。 访存指令乱序执行的关键技术包括: (1) Non-blocking技术, 即在前面的访存指令由于CACHE不命中进行长延迟的存储访问时, 后面的指令可以继续访问CACHE。 (2) Memory Disambiguation技术, 即在存数和取数指令都乱序执行的情况下, 保证取数指令都能取回它前面的最近一条对同一地址的存数指令所存的值。 比如如果一条取数指令在一条存数指令之后且两条指令的地址相等, 但取数指令先访问CACHE, 也要保证取数指令取回该存数指令的值; 又如如果一条取数指令在一条存数指令之前且两条指令的地址相等, 但存数指令先访问CACHE, 也要保证取数指令取回原来CACHE中的值, 而不是存数指令新存的值。 (3) Load Speculation技术, 即在取数指令访问CACHE后, 它前面的存数指令地址还没有确定 (即取数指令从CACHE中取回的值有可能是错误的) , 先把取数指令从CACHE中取回的值送给后续的指令用, 如果后来发现它前面的存数指令和该取数指令访问的是同一个单元, 再取消该取数指令后面的指令。 (4) Write Buffer技术, 由于存数指令也是乱序执行的, 存数指令所存的值不能立即写到CACHE或内存, 而是要根据存数指令在程序中的次序写到CACHE或内存。
硬评:一分钟了解i5-9400F性能
7nm锐龙直击 AMD发布会图赏