中田真秀(なかたまほ)のブログ

研究について、日常について、その他。

MBLAS Raxpyを四本動かしてもパフォーマンスは落ちない

2010-04-09 17:25:42 | 日記
藤澤先生から

> OpenMP ではなく、単純に4つのプログラムを同時に実行したらどうなりますか?
> 私のブログでも以前書きましたが、意外と性能が変わらないで、4つとも
> 140MFlops に近い値が出るかもしれません。

Ubuntu 9.10 amd64/gcc4.1/DDR3 1066/Core i7 920で
Raxpyのベンチマークを四本流した。

4本同時だと、135MFlopsでた。すべてのRaxpyベンチマークで、である。
5本目を流すと、80MFlops x 2, 135Mflps x 3 と2本のスピードが落ちた。

となりました。

GotoBLAS2-1.13で打ち止めへ

2010-04-09 13:29:50 | 日記
GotoBLASは後藤和茂さんによる、BLASの一つの実装である。特徴は、何といっても世界最高速ということ、と、ソース公開ということにある。いわゆるオープンソース(FLOSS)ではないが、ソースコードは無料で入手可能である。ここから入手できる。後藤さん自身のチュートリアルもある。もちろんFreeBSDでもportsを作っており、いくつかのportsでは、もしGotoBLASがインストールされていた場合、こちらが利用される。

しかし今後については、GotoBLAS2-1.13が最終バージョンになる。

というのも、後藤さんはTACCに所属していたが、MicrosoftのHPC(high performance computing)部門にヘッドハントされたからだ。東工大の松岡聡教授のtweetによると...

> 業界で有名な「後藤」といえば Impress後藤氏とBLAS後藤氏だが、
> 後者が何とマイクロソフトのWindows HPCチームにヘッドハントされた (以下略)

さらにこのエントリーを読んでくださった後藤さんからのコメントによると:

> MKL か ACML を使ってくださいな。

ということであった。つまりGotoBLAS2-1.13で後藤さんからの開発は
打ちきりということである。

(2010/4/12後藤和茂さんからの指摘により、不確定要素をなるべく排した)

初めて日本語で論文を書いた!

2010-04-09 12:40:02 | 日記
前にも書いたが、第15回計算工学会2010/5/28 15:00 E-14-2 MPACK (MBLAS/MLAPACK) 高精度BLAS/LAPACKライブラリの作成で発表する。ここで初めて日本語で論文を書いた。英語と日本語の言い回しの違いってけっこうあるんだなと思った。この論文フルペーパーにして出すべきだよなぁ。今日が締切りである。

Core i7のメモリバンド幅測定 dgemm で21Gb/sec (82% peak)

2010-04-09 08:48:14 | 日記
Core i7のメモリバンド幅を測定するにはということについて。
ubuntu 9.10 amd64 Core i7 920/DDR3-1333で行った。GotoBLASを用いた。


問題意識:
メモリの転送速度はDDR3-1333で10.67Gb/sである。
一方インテルによると25.6 GB/sである。
では、GotoBLASで測定できるかどうか(多少本末転倒してるけど)。
ちゃんと公称スピードは出てるのだろうか?

やってみた
失敗例: daxpy で15.6G/secでた。export GOTO_NUM_THREADS=1で計測したら、n=1,0000,0000で、だいたい1.3Gflops出た。この意味を解釈すると、
daxpyは2回の浮動小数点演算、3回のロード/ストア=24bytesの書き込み。
一回あたり12bytesのメモリ転送が必要。だから、バンド幅25.6/12=2.133GFlopsで出ているとよい...がその半分しかでてない。1.3GFlopsならば1.3x12=15.6GFlopsというわけである。

成功例: dgemmを用いろと、後藤和茂先生からmixi経由で教えていただいた。

> キャッシュの関係で性能が悪くなるので prefetchnta と movntps との
> 組み合わせが必要になる。けど、キャッシュにはデータが残らないので、
> 普通の演算に使うと性能は逆に悪化する。
> 真のバンド幅を計りたければ、dgemm で m=n=特大, k=1, alpha=beta=1.
> でマルチスレッド環境下で調べるとよい。AXPY とか stream じゃ
> 本当の性能はわからないよ。

そこでご指示どおり、m=n=20000, k=1, alpha=beta=1として測定してみた。大体1.5-1.75GFlopsでた。さて、この場合dgemmも12bytesの転送が必要(GotoBLASの実装ではbeta=1の場合はb*Cをバイパスする、alpha=1でも掛け算する;参照BLASと同じである)。従って、1.5 - 1.75*12= 18 - 21Gb/sec程度のパフォーマンスが出ていることがわかった。

結論。Core i7のメモリバンド幅が測定した。GotoBLASのdgemmを用いた。
Corei7 920, DDR3-1333だと、だいたい21Gb/secくらいでた。これはIntelの公称値25.6Gb/secの82%である。

Core i7公称flopsの計算方法推察周波数x4 (コア) x 4(加算器/コア)

2010-04-09 08:44:41 | 日記
Core i7 920の公称flopsの計算方法は次のようであると推察される。

周波数x4 (コア) x 4 (加算器/core)
この場合、2.66 x 4 x 4 = 42.56である。
さらに、TurboBoostが効く場合は、
2.8 x 4 x 4 = 44.8
インテルが出している公称flopsは
ここから読めるが、これと完全に合致した。

GotoBLAS2 1.13 on Corei7 920でパフォーマンス測定した。
Turbo Boost off で、dgemmの性能が40.6GFlopsとなった。これはピークの95%程度である。
Turbo Boost on では、dgemmの性能が42.0-42.7GFlopsとなった。これはピークの93.8% - 95.3%である。

ちなみに「インテル® マイクロプロセッサー製品の輸出規制基準」と銘打ってある。きっとピーク性能は輸出入に関する規制基準になるのだろう。

2010/4/12追記: TurboBoostにふれた。文章微調整。