前回に続いて、SPE においてのデータ転送、処理サイズのバランスについて。
DGEMM(Double)では、2行ずつ処理していくのが効率的であると述べたが、
今回は SGEMM(Float)について、プロファイルをしてその結果から考察していく。
まずは、サイズ、使用 SPE ごとの実行時間である。
SPENUM 512x512 1024x1024 2048x2048 [msec]
1 360 2600 22000
2 200 1500 12000
3 150 1060 8200
4 125 830 6400
5 113 710 5400
6 105 630 4700
倍精度演算と比べれば確かに早くなってはいるが、あまり期待どおりとはいえない。
今回も前回同様、処理とデータ転送のバランスを見ていく。
[データ転送 / 積和演算]
SPENUM 512x512 1024x1024 2048x2048 [msec]
1 0.17 / 0.4 0.3 / 0.8 0.6 / 1.7
~
6 0.2 / 0.4 0.4 / 0.8 0.8 / 1.7
結果からは、思ったよりも積和演算が足を引っ張っているのかもしれないと考えられる。
[データ転送数]
512x512 では、512 x 4(2行、2行) x 4(float) = 8Kbyte
1024 x 1024 では 16Kbyte、2048 x 2048 では 32Kbyte となる。
[積和演算数]
512x512 では、2 x 2 x 512 = 2048 回の積和演算、
1024 x 1024 では 4096 回、2048 x 2048 では 8192回の積和演算することになる。
8Kbyte の2倍と 2048 回の積和演算、16Kbyte の2倍と 4096 回の積和演算、
32Kbyte の2倍と 8192 回の積和演算がそれぞれ同じくらいとすると、
やはり「データ:積和演算=8:1」であるようだ。
処理を早くすることは難しいので、
それに見合うように「4行ずつ DMA 転送する」などの改良してみようと思う。
もう少し調べてみよう。
DGEMM(Double)では、2行ずつ処理していくのが効率的であると述べたが、
今回は SGEMM(Float)について、プロファイルをしてその結果から考察していく。
まずは、サイズ、使用 SPE ごとの実行時間である。
SPENUM 512x512 1024x1024 2048x2048 [msec]
1 360 2600 22000
2 200 1500 12000
3 150 1060 8200
4 125 830 6400
5 113 710 5400
6 105 630 4700
倍精度演算と比べれば確かに早くなってはいるが、あまり期待どおりとはいえない。
今回も前回同様、処理とデータ転送のバランスを見ていく。
[データ転送 / 積和演算]
SPENUM 512x512 1024x1024 2048x2048 [msec]
1 0.17 / 0.4 0.3 / 0.8 0.6 / 1.7
~
6 0.2 / 0.4 0.4 / 0.8 0.8 / 1.7
結果からは、思ったよりも積和演算が足を引っ張っているのかもしれないと考えられる。
[データ転送数]
512x512 では、512 x 4(2行、2行) x 4(float) = 8Kbyte
1024 x 1024 では 16Kbyte、2048 x 2048 では 32Kbyte となる。
[積和演算数]
512x512 では、2 x 2 x 512 = 2048 回の積和演算、
1024 x 1024 では 4096 回、2048 x 2048 では 8192回の積和演算することになる。
8Kbyte の2倍と 2048 回の積和演算、16Kbyte の2倍と 4096 回の積和演算、
32Kbyte の2倍と 8192 回の積和演算がそれぞれ同じくらいとすると、
やはり「データ:積和演算=8:1」であるようだ。
処理を早くすることは難しいので、
それに見合うように「4行ずつ DMA 転送する」などの改良してみようと思う。
もう少し調べてみよう。