西西河

主题:世界首台100P超级计算机-神威太湖之光在中国诞生了! -- 尖石

共:💬105 🌺723 🌵7 新:
全看分页树展 · 主题 跟帖
家园 数据移动速率也会影响Linpack,但是影响比较小

Linpack的操作对象是一个稠密矩阵,可以认为就是C中的二维数组。其操作大致是这样的,每个循环中首先喂每个计算线程m个数字,要计算线程在其中做m^2次浮点运算,然后在计算线程间交换m个数字,再让计算线程做m^2次浮点运算。然后这样的循环迭代n次。对每个循环我们有:

1) 输入(/输出)m个数字

2) k*m^2次浮点运算

3) 线程间交换m个数字

可以看出来浮点运算的阶数比数据移动(包括第一步和第三步)多1。因此当n元一次线性方程组中间这个"n"变大时,浮点运算的次数增长得比数据移动更快,那么每次浮点运算消耗的时间在总时间中的权重也就越大。如果你的机器浮点运算快,但是数据移动慢,那么你就玩个花招,选择一个更大的n,这样表现相对就好一些;反之你就选择一个小一点的n。

在这里缓存的大小是有影响的,主要影响第1步。如果你要操作64MB的数据,如果你的缓存是1byte,你需要去取内存64M次,如果你有64k的cache,理想情况下是1k次,如果你有64M的cache,理想情况下你只需要取内存1次。读写同样大小的数据,多次少量读写的时间明显长于少次大量读写,所以如果你真的去做取内存64M次这样的操作,性能必定惨不忍睹。如果内存数据是连续的,其读写就偏向于理想情况,同时取1k次64k内存和取1次64M内存,很多时候差距不是那么显著。Linpack数据是规规矩矩排好的,编译器也知道CPU的缓存大小之类的信息,计算线程一次读取连续的一段数据,cache miss被最小化,因此缓存超过一定大小很多时候差距不甚显著。

但是普通应用程序在64M缓存的CPU和在64k缓存的CPU上性能差距很大,这是因为普通应用程序通常任意随机访问内存,又没有为特定的CPU的缓存大小做优化,因而经常发生cache miss,缓存大小的差距就暴露出来。HPCG操作的是压缩存储的稀疏矩阵,就是将非零的矩阵元素按行或者列连续地存在一起。这个时候对程序而言找一个元素要好几步寻址操作,内存访问偏向随机的内存访问,缓存的大小就变成关键性的因素之一。

通宝推:唐家山,预备役师的防化,
全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河