« Cellプログラムのデバッグ | トップページ | Core2 Quadの最大演算性能 »

Cellの最大演算性能

Cellの最大演算性能は以下の式で計算できます。

  • SPU (SPE)あたりの論理性能(FLOPS) = クロック x 4データー x 2FLOPS

この考え方は、東芝レビューの「次世代プロセッサCell Broadband Engine」に記載がありました。SPUでは、SIMD演算を使用して1クロックサイクルで4つの積和演算(乗算と加算)を行うことができるため、クロックサイクルあたり8演算が実行できることになります。

PS3に搭載されているCellのクロック周波数は3.2GHzとされています。したがってSPU (SPE)あたりの論理性能は 3.2G x 8 = 25.6GFLOPSになります。

PS3 Linuxでは最大6SPUが使用できるため、Cellの論理性能は、25.6 x 6 = 153.6GFLOPSになります。以前から、実際の性能がどの程度になるかを実測したいと思っていました。

論理性能と実性能

現実的な大規模計算では、データーをメモリーから演算器に読み込む必要や計算結果をメモリーに書き戻す必要があるため、メモリーのリード・ライトが大量に発生します。例えば、4096 x 4096要素をもつ単精度浮動小数点の行列のデーター量は64Mbyteになります。全データーはCPU内のキャッシュに乗らないため、CPUに比べて何百倍も遅いメインメモリーとのデーター転送が発生し、データーフェッチ中に計算が止まる空白期間が発生することで実性能が低下する可能性があります。

そのため、私は、メモリー性能がボトルネックになり、現実的なアプリケーションで論理性能が発揮できることはないと思っていました。

Cellの最大性能が測定できるアプリケーション

実は、身近なところに絶好のアプリケーションがありました。Cell SDKに入っている、行列積を求める「matrix_mul」です。ソースは "/opt/cell/sdk/src/demos/matrix_mul"にあり、make一発で簡単にコンパイルできます。

論理性能を引き出すための条件とは

Matrix_mulのREADME.txtファイルには、「本プログラムは高度な最適化を行っており、理論値に近いピーク性能を出せる」と書いてあります。うむむ、本当か? 論理性能近くを出すためには、以下の条件を満足する必要があるはずです。

  1. 計算に必要な行列A, B, Cはメインメモリーに保持されるため、SPUへのデーターのロードと計算結果のストアーを行うためのDMAが必要となる。DMAと計算処理を平行して行い、演算を切れ目なく行う必要がある
  2. 1回のDMAで転送できる最大データー量は16KBとなるため、行列をブロック単位に分割し、小刻みにデーター転送しながらを計算を行う。切れ目なく計算を行うためには、1ブロックの計算時間以内に、前ブロックの計算結果のストア(DMA)と次ブロックの計算に必要なデーターのロード(DMA)が完了する必要がある
  3. 命令の実行順序に配慮して、1 SIMD命令/クロックとなるように最適化を行う
  4. ループで消費される処理ステップを極力減らす(ループアンローリング)
  5. 計算データーのセットアップ(レジスタへのロードなど)で消費される処理ステップを極力減らす

1項に関しては、CellはSPUの処理とMFCを使用したDMAが並列動作するため可能です。

2項に関しては、ダブルバッファーを使用することで可能となりますが、DMA転送するデーター量と処理時間の関係を微妙にチューニングする必要がありそうです。計算処理が単純すぎると、DMA時間>計算時間となり、計算処理がストールする時間が発生してしまいます。

3項に関しては、SPUの命令実行はインオーダーのみで、パイプラインの流れを最適化するためにハードレベルで命令の実行順序を入れ替えてくれることがないため、ソフトレベルの最適化がが必須となります。

matrix_mulの実行

matrix_mulをコンパイルしたら実際に実行してみます。このプログラムはM x Mの行列積を計算します。そのため、入力データーになる行列a, bと、計算結果を格納する行列cをメモリー上に確保する必要があります。私の環境では、runlevel 3でPS3 linuxを起動した際の空きメモリーが約140Mbyteです。

4096 x 4096の計算を行うためには、64M x 3 = 192Mbyteのメモリーが必要となり、空きメモリーが不足するため、2048 x 2048 と 3072 x 3072で計算を行うことにします。

matrix_mulは上記のように大きなメモリーを使用するため、TLB(仮想アドレスから実メモリーアドレスへの変換テーブル)のミスヒットによるメモリーアクセス性能低下を避けるため、linuxカーネルのhugetlbfsという機能を使用することができます。Fedora 7の最新カーネルではhugetlbfsは以下のように有効になっていますが、メモリーの割り当ては行われていません。

 # cat /proc/meminfo
 MemTotal:       216780 kB
 MemFree:       139960 kB
   ・
   ・
 HugePages_Total:     0
 HugePages_Free:     0
 HugePages_Rsvd:     0
 Hugepagesize:    16384 kB

hugetlbfsを有効にするためには、まずはファイルシステムのマウントを行います。

 # mount -t hugetlbfs nodev /huge

次にHugepageに割り当てるページ数を指定する必要があります。3072 x 3072の計算を行うためには、7ページが必要となるため、以下の設定で8ページを確保します。

 # echo 8 > /proc/sys/vm/nr_hugepages

Hugepageを確保した分空きメモリーが減少します。

# cat /proc/meminfo
MemTotal:       216780 kB
MemFree:         8788 kB
   ・
   ・
HugePages_Total:     8
HugePages_Free:     8
HugePages_Rsvd:     0
Hugepagesize:    16384 kB

いよいよ、m = 3072で計算を行います(-i 5は計算の繰り返し回数です)

 # ./matrix_mul -i 5 -m 3072 -s 6 -p
 Initializing Arrays ... done
 Running test ... done
 Performance Statistics:
   number of SPEs     = 6
   execution time     = 2.08 seconds
   computation rate   = 139.36 GFlops/sec
   data transfer rate = 8.80 GBytes/sec

結果は、139.36 GFLOPSです なんと、論理性能の91%が出せたことになります。

性能測定結果のまとめ

matrix_mulを3回実行した平均値を以下に示します。

要素数SPU数GFLOPS論理性能比
3072 6 139.36 91%
3072 1 23.23 91%
2048 6 138.51 90%
2048 1 23.21 91%

上記に示すように、SPUx1に対して、SPUx6はきっちり6倍の性能となりました。ちなみに、Hugepageを使用しない場合でも、まったく同じ測定結果となりました。この程度の要素数ではHugepageを使用するメリットは得られないようです。

論理性能はレジスタ間で計算を繰り返した場合のような非現実的な条件でしか出せないと思っていたのですが、DMAを繰り返すような現実的な条件でここまでの性能が出せるとは驚きです。SPUx6が同時に動作してもリニアに性能が伸びる点もすごいです。

前述したCellの論理性能を引き出すための条件が成立するアプリケーションレンジは狭く、セルはピーキーでプログラムしづらいCPUであることに変わりはないのですが、性能を追求したアーキテクチャーになっていることがよく分かりました。45nm(Penrynコア)のCore2 quadが発売されたらMy PCのCPU交換を行いたいと思っており、その際はまたベンチマークをやってみたいです。

ただ、matirx_mulのソースを眺めたのですが、SPUコードの計算部分は何をやっているのかサッパリ分かりません。行列積計算の並列化に関してはいろんな論文があるようなので、そこからお勉強が必要になりそうです。

2008/2/11追記

行列積の計算は、ピーク性能が出しやすいベンチマークであるとのご指摘をいただきました。Webで調べてみると、確かに、行列積はデーターの再利用を行いやすく論理性能の8〜9割を出せるライブラリーがあるようです。BLASのsgmmライブラリーを使用してMy PC (Pentrimum4 530@3.4GHz)で4096 x 4096の行列積を計算してみたところ、以下の結果となりました。

ライブラリー種別GFLOPS
ATLAS 6.61
GotoBLAS(1 thread) 11.22
GotoBLAS(2 thread) 11.14

P4 3.4GHzの論理性能が13GFLOPS (3.0GHzで12GFLOPSという数字を見たことがあります)とすると、GotoBLASは論理性能の85%以上を出せていることになり非常に優秀です。計算も以下のライブラリを呼び出すだけなので楽ちんです(リンクがうまくいかず苦戦しましたが)。

    // 配列a,b,cを格納するメモリーを確保
    a = (float *)memalign(256, msize*msize*sizeof(float));
    b = (float *)memalign(256, msize*msize*sizeof(float));
    c = (float *)memalign(256, msize*msize*sizeof(float));

    // 行列の初期化
    for(i=0; i<msize; i++) {
        for(j=0; j<msize; j++) {
            a[i*msize+j] = rand_0_to_1();
            b[i*msize+j] = rand_0_to_1();
            c[i*msize+j] = 0.0f;
        }
    }

    // BLASライブラリの呼び出し →  C = α A・B + βC
    cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, msize, msize, msize,
        1.0f, a, msize, b, msize, 0.0f, c, msize);

P4 530はHTが使えるため、GotoBlasでは2スレッドを使用した並列処理もできましたが性能は同じでした。SSEの演算機が2組あるマルチコアCPUなら2スレッド時の性能がもっと上がると思います。

行列積だとアーキテクチャーが異なっても論理性能の8割以上は出せるということですね。普段科学技術計算などやることがないので(本職はIPネットワークSEです)、今回は大変勉強になりました。

« Cellプログラムのデバッグ | トップページ | Core2 Quadの最大演算性能 »

Cellプログラミング」カテゴリの記事

コメント

SGEMM(単精度行列積)というのはピーク値をベンチマークするのによく使われているくらいで、ピーク値が出やすい処理です。
僕もPS3を買った際に真っ先に行列積を書いてベンチマーク取りましたが、二次元のデータで三次元の演算を行うため、メモリからちょろっとロードして殆どはレジスタの演算です。

Cellの最大演算性能を測定するためにCell SDKをインストールしてmatrix_mulを
実行しようとしたのですが、ありませんでした。
SDKのバージョンは3.1でした。新しいものにはmatrix_mulはないのでしょうか?

Fedora系の場合、ディストリビューションにSDK3.1が含まれませんので、私のblog「Cell SDK 3.1のインストール」の手順でインストールした場合、defaultでmatrix_mulを含むサンプルソースがインストールされる筈です。
ひょっとして、YDL6.1のような、SDK3.1を含むディストリビューションをお使いでしょうか。

インストールDVDに「cell-demos-3.1-1.ppc64.rpm」というファイルがない場合、SDK3.1のisoイメージをダウンロードしてサンプルソースを追加インストールする必要があります。以下の手順でインストールできると思います。
1)「Cell SDK 3.1のインストール」に示したURLから3つのファイルをダウンロード
2) rpm -ivh cell-install-3.1.0-0.0.noarch.rpm
3) /opt/cell/cellsdk --iso mount
  < >内は、ダウンロードファイルを保存したディレクトリ名を指定
4)yum groupinstall "Cell Programming Examples"

/opt/cell/sdk/usr/bin/demos にコンパイル済みの実行ファイルもインストールされます。

すみません、返事が遅れました。
使っているディストリビューションはYDL6.1です。
手順通りにやってインストールすることができました。
ありがとうございました。

この記事へのコメントは終了しました。

« Cellプログラムのデバッグ | トップページ | Core2 Quadの最大演算性能 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ