見出し画像

【異端のプロセッサ】Cell/B.E.の高速化手法3選

ムンペイと言います。30年以上プログラミングをしており、特に高速化(最適化)の分野で長く関心を持ち、現在も高速化プログラミング関連で仕事をしています。

私はソフトウェアエンジニアとして、様々なハードウェア上で高速化プログラミングを行ってきましたので、それぞれ特徴とともにときどきご紹介したいと思います。

今回は私にとって思い出深いプロセッサである、Cell Broadband Engine (Cell/B.E.) です。


Cell/B.E.の歴史と概要

Cell/B.E. こと Cell Broadband Engine (セルブロードバンドエンジン)は、PlayStation 3 (PS3) のメインプロセッサとして、Sony、Toshiba、IBMの3者の合同チームによって開発されました。Sony はもちろんPS3で使うためにチームリーダーの役割を担当し、 Toshiba と IBM はそれぞれ製造技術の提供という役割に加えてそれぞれ自社の家電やサーバー製品などに使うことが視野にありました。

Toshibaはテレビ(通称 CELL REGZA)や計算アクセラレーターボード(Spurse Engine SE1000)を、IBMは史上初めて1PF(ペタフロップス)を達成したスーパーコンピュータ RoadRunner やブレードサーバー(BladeCenter QSシリーズ)を(※1)、ソニーも放送機器(ZEGOシリーズ)など、それなりに多くの製品が実際に発売されました。
当時 Sony の CEO だった久夛良木健氏も「Cellコンピューティング」という構想を語っていらっしゃいましたよね。

※1:IBMのRoadRunnerやBladeCenter QSの後期版では、Cell/B.E.の強化版である、PowerXcell 8i というチップを使いました。

Cell/B.E.は、SIMD計算を担う8基の Synergistic Processor Element (PPE) と、SPEの制御とOSの実行を担う PowerPC Processor Element (PPE) の、2種類の異なる(ヘテロジニアスな)コアを持つヘテロジニアスマルチコアプロセッサです。また、XDR DRAMという高速なメモリを主記憶として利用します。

SPEはDSP(Digital Signal Processor)的な演算特化のコアで、単精度浮動小数点演算を4並列でSIMD実行できるインオーダー実行コアと、128本の128bitレジスタ、そして256KBの専用メモリLocal Store(LS)を備えています。LSとシステムの主記憶は明示的なデータ転送(DMA、Direct Memory Access)が必要で、各SPEはCell/B.E.の中にありながら独立したプロセッサのようでした。

4単精度演算/clk x 3.2GHz  x  8SPE = 102.4GFlops、Multiply-Addの命令を使えば1命令2演算なのでその2倍となり合計204.8GFlopsの性能があるうえ(PPEもSIMD演算できるので、チップ全体ではもう少し上がります)、オーバーヘッドの少ない設計のおかげで使いこなせば理論値に極めて近い実効性能を引き出せるプロセッサでした。

SIMD演算でクロックあたり演算を最大化

まず基本のキとなりますが、SIMD演算を如何に活用してクロック当たり4個のデータを演算できるかが重要です(※2)。SPEの命令セットは、PowerPCのSIMD命令を参考にして新規に専用に開発されたもので、分岐やロードストアを除いて原則としてすべての演算命令がSIMDで、すべての命令が128bit単位の処理でした。ですのでデータ処理を行うにはとても都合がよく、気持ちよくSIMDすることができました。

※2:4並列は単精度浮動小数点の場合。8bit整数演算なら16並列での実行です。

一方、制御系の処理はSIMDは不要なので、128bitレジスタのうち32bitとか8bitとか限られた部分だけを使うことになり、SPEの性能を引き出すことはできません。できるだけ、多量のデータを計算する処理だけをSPEに持っていくというソフトウェア設計が必要でした。

なお、多量のデータの計算の中で、各データごとに分岐処理を行う必要もままあります。たとえば飽和処理のように、ある最大値を超えたら(超えそうだったら)・・・という条件の処理などです。

こういう場合は、Select命令というSIMD演算が利用できました。比較演算をSIMD実行し、その結果もSIMD的にレジスタに格納されます。そして、比較結果が真のスロットはレジスタAから、偽のスロットはレジスタBから値をコピーして、レジスタCに合成して出力する、というものです。動きとしては、GPUのSIMT (Single Instruction Multiple Thread)にも近い感じです。Select型の方が適用できるケースが限定されますが、ハマれば SIMTよりも原理的には効率がよいと思われます。

このあたりのことに触れている、後藤弘茂さんの記事を置いておきます。

ループアンロールでパイプライン最適化

SPEは、インオーダー実行のプロセッサであるため、パイプラインにどのように流れていくかはコンパイル時にわかります。ですので、コンパイルしてみてはパイプラインの様子を確認し、空きがあれば次の工夫をするという作業をします。

パイプラインを埋める方法の1つは、ループアンロールです。

繰り返し演算はふつう1回分の処理をfor/whileなどのループ構文で囲って繰り返す回数を与える、という書き方をすると思います。

これを素直にコンパイルすると、1回分の処理をするたびに処理の先頭にジャンプするというCPU命令が生成されます。ジャンプするとパイプライン実行はリセットされてしまいますので、ループ内の処理量が少ないと、ほぼパイプライン実行されないという状況になってしまいます。

そこで、1回のループで行う処理を増やし、ループの繰り返し数をその分減らすという手法がループアンロールです。なんとなく、原始的な方法ですが、かなり効果がありました。(※3)

※3:x86はアウトオブオーダー、分岐予測、投機的実行などを駆使してジャンプ先の命令もパイプライン実行できるので、アンロールしなくてもかなり良い性能が出ますが、すればもっと良くなることもあります。

SPE向けのコンパイラでは、パイプラインの埋まり具合をビジュアルに確認できる Assembly Visualizer というツールがIBMから提供されていました。IBMにはもう資料が見当たらないのですが、個人の方が作った下記のページを見つけましたので、そちらもご覧ください。

なお「使い方」でリンクされている2記事はすでにIBMがページを閉鎖してしまって参照できませんが、Wayback Machine で見つけましたので下記に置いておきます。(ただし、残念ながら画像が消えています。上記のサイトに同様の解説があるので雰囲気はわかるかと)

DMAを使ったデータ転送と演算の並列実行

DMA こと Direct Memory Access とは、CPUが介入せずに2つのメモリの間でデータ転送する仕組みのことで、コンピュータでは結構一般的に取り入れられている(が、縁の下の力持ちで目立たない)ものだったりします。

Cell/B.E.の場合は、特に PPE に接続された主記憶(XDR DRAM) と SPE 内の Local Store (LS) の間のデータ転送で、DMA の利用が必須でした。

DMA は CPU と完全に並行して実行されるため、メモリ空間のうちCPUが読み書き真っ最中の領域にDMAによる書き込みを行うと、タイミング次第でどんな値になってしまうかわかりません。逆もまたしかりです。

このため、データ転送の設計は極めて重要でした。典型的にはダブルバッファというテクニックを用います。演算結果を書き込む領域をAとBの2つ用意しておき、最初の演算はAに対して書き込み、演算が終わったらAのデータをXDRにDMAしている間に次の演算をBに対して行う、その演算が終わったらAとBの役割を入れ替えて同様に実行、その繰り返し・・・、という形です。転送が終わる時間と、演算が終わる時間を大体一緒に揃えるのが、ベストの設計になります。DMAもパイプラインの一つだと考えればよいでしょう。

さらに詳しいことを知りたいと思われた方は、当時SPE向けのプログラムを解説した同人誌を出された方のページが今もありましたので、こちらに載せておきます。(著者はnosukeさん)

Cell/B.E.に関われた幸せ

PS3自体はそれなりに売れましたし、Cell/B.E.の性能は思想通りの高水準を達成したものの、その分発熱も費用も高く、Cell/B.E.はその構想ほどには発展することができませんでした。商業的な意味では成功したプロセッサとは言えないのかもしれません。しかし、Cell/B.E.が起こした波紋は多数のプロセッサに影響を与えて、良い意味で爪痕を残したという評価も聞こえます。

実は私もCell/B.E.を使った製品の開発に関わっており、その製品は医療機器の画像処理エンジンに採用されて多数生産されました。きっといまでもあちこちの病院で、様々な人々の健康に貢献していると思います。このような歴史の1ページと人類の幸せに少しでも関われたということはとても幸せです。

いやぁ、本文を書いていたら、次々と思い出がよみがえってきますね。Cell/B.E.は、プログラマの力が素直に反映されるので、とても楽しいプロセッサでした。他にもいろいろお話したいことも尽きませんが・・・、その話はまたの機会に。

これにて御免!

(本記事のタイトル画像は Greenpro の This photo was taken of my own PS3 after taking it apart and cleaning off the elements. (CC 表示-継承 3.0による) を改変して作成されており、クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。)

この記事が気に入ったらサポートをしてみませんか?