18.3. 行列乗算の手順と速度
これは、 U、L がオンメモリかどうかが、、、とはいえ、基本的にはのらない。
読み出しは速い、ということも考慮する必要あり。大体2倍。
まず、ブロックサイズは 8k では不足で 16k が必須。8k ですますには4台必
要だが4台で書き込み 800MB/s はでないため。
-
オンメモリで 32K 正方行列を持つ
-
(32 k x 2k), (2kx32k) をそれぞれSSD から読出して、掛け算して積算を8回繰り返す
-
ディスクにしまう。
というのが簡単な手順だけど、これだと効率が 50% になってしまう。オンメモ
リでの計算と、計算が済んだとこの書き込み、まだ計算してないところの読み
出しを並行させる必要あり。
例えば、 16x32 の B (U)と、C を2つ持つことを考える。行列サイズは 32x48
なのでメモリにはまだ十分入る。
16k x 32k の時の速度は
sandy02 M=16384 N=32768 K=2048 ip=1.6581e-01 jp=2.2204e-01
fo=2.7792e+00 all=3.1670e+00 694.35 GFlops
で、ピークの 85% にはなる。まあまあ。通信がもうちょっと速くなれば 87%
くらいにはなるかも。この時、基本的な手順は
-
(すでにメモリにあるわけでなければ) 32k の B, 16k の A, 32k のCをロード
-
掛け算と並行して次の A,C をロード
-
以下、
を並行にやる。
最初のA,Cのロードは頑張れば計算と並行にできる。なので、オーバーヘッドと
してみえるものは、最初の B のロード。次の列に移る時には A のロードはな
い(再利用できる)ので、Bのロードをすることも可能。
なので、オーバーヘッドは基本的に固定で、最初のBのロードと最後の C のス
トアの半分くらい。あれ、B のロードももちろん最初の 2k x 32k 以外は隠蔽
できる?そうすると、隠蔽できないものって本当にに少しだ。基本的にはほぼ
800MB/s で読めるBの 32k分だけ。あとは 16k x 32k で効率を 90% 程度まで
上げることができれば、、、
この場合にどの程度の電力性能が実現できるか、が問題かな。具体的には2を
超えるかどうか。700Gflops/node に行けるかどうかは上のアルゴリズムでは
ちょっと難しい。これは、オンメモリでの行列乗算サイズが 16k x 32k と
小さいため、というか、それでは隠蔽できてない通信と遅い通信があるため
タイミングは
sandy02 M=16384 N=32768 K=2048 ip=1.6581e-01 jp=2.2204e-01
fo=2.7792e+00 all=3.1670e+00 694.35 GFlops
で、ip, jp の通信量はそれぞれ 256, 512 MB なので、実効的な通信速度が
が 1.5 GB/s, 2.4 GB/s である。 これで、理想的に通信の隠蔽ができると
760Gflops まであがる。