-
並列プログラミングフレームワーク Cerium の改良
金城 裕
琉球大学理工学研究科情報工学専攻
-
研究背景と目的(1/2)
当研究室では、マルチコアCPU上での開発を支援するたの、並列プログラミングフレームワーク Cerium を開発し、学生実験で使用している。本研究では
Cerium の信頼性の向上を目的とし、改良を行った (信頼性 = 仕様通りに動作する)
マルチコア上の並列プログラミングでは
- 並列処理部分の特定や同期処理を適切に行わなければ、台数効果は得られない。
- 再現性ないバグなどが発生する可能性がある
- アーキテクチャを理解し最適なプログラムを書く必要がある
など信頼性のあるプログラムを開発するには逐次プログラミングよりも技術と手間がかかる問題がある
Cell上でのゲーム作成を行う学生実験でも、講義期間中に作品が一定のレベルに達しない問題が生じた。そこで学生実験での使用を考慮した フレームワーク Cerium を開発した
-
研究背景と目的(2/2)
Cerium を用いて 期間中のゲームの作成が可能になった。しかし学生実験での使用や、例題の実装を行い Cerium の信頼性が十分でない点が明らかになった。
- 仕様通りの稼働率がでない
- アーキテクチャ依存の記述が避けにくい
以上の問題点を解決するため
- ソフトウェアMailQueueの実装
- TaskをグルーピングするTaskArrayの実装
- 明示的なDMAロードを隠蔽するMemorySegmentのAPIの実装
- 細かなTaskのチューニング
などの改良を行い、信頼性のある並列プログラミングフレームワークを目指す。
-
Cell Broadband Engine
研究、実験の題材となった Cell Broadband Engine とは、
- ソニー、SCE、 IBM、 東芝によって開発されたプロセッサ
- マルチコアで、9つのコアを持つ
- 制御用コア PorwerPC Processor Element 1基
- 演算用コア Synergistic Processor Element 8基 (実験で使用できるのは6基)
- 各コアは Element Interconnect Bus を経由してデータアクセスを行う
-
DMA
SPE は直接 MainMemory にアクセスできない。 明示的な DMA 転送を用いる
-
Mailbox
PPE と SPE の通信には Mailbox を用いる
- PPE と SPE 間で32ビットメッセージの交換ができる
- Mail の Queue は3種類
- SPU inbound Mailbox: PPE -> SPE
- SPU Outbound Mailbox: SPE -> PPE
- SPU Outbound interrupt Mailbox: SPE -> PPE (割り込み)
-
Cerium
Cerium とは
- 並列プログラミング用のフレームワーク
- 学生実験での使用を考慮して PS3/Cell, Linux, MacOSX で動作する
- 構成
- TaskManager
- RenderingEngine
- SceneGraph
-
TaskManager
TaskManager とは Task のスケジューラ
- Task とよばれるデータ構造を提供
- 処理(単位は関数に近い)を Task で記述していく
- 定義された、Task の情報に沿って各コアに処理を割り振る
Task で記述された部分の、自動的な並列処理スケジューリングを行う。
-
RenderingEngine(1/2)
PS3 では Graphics Engien の仕様が公開されていないので、独自の RenderingEngine を開発した。
Task で記述され、主に3つの Task から構成される
- CreatePolygonTask
- CreateSpanTask
- DrawSpanTask
- Span を Texture とマッピングし画面に出力する
-
RenderingEngine(2/2)
例: Cube のモデリングデータの場合には、以下のように Task が働く。
-
SceneGraph
ゲームのシーンを構成する木構造のグラフ。
-
Cerium の改良
RenderingEngine を用いた例題で、ball bound, panel がある。(FPS = Frame per second)
|
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
ball bound |
30.2 |
1.8% |
74.3% |
23.7% |
panel |
4.0 |
21.3% |
11.1% |
67.6% |
ball bound では Mail 待ちが約70%と、稼働率が出ていない。
panel は ball bound より処理の描画の処理が重く、その分稼働率が高くなっている。
アムダールの法則より稼働率がでないとマルチコアの性能は発揮されない。フレームワークとしての信頼性が十分でない
-
Mail 通知のスケジューリング
Cerium では SPE が Mail で 待ち時間が発生するタイミングは2つ
- TaskList を待つ場合
- Mail の書き込みを待つ場合
-
TaskListのMail待ち
TaskList は処理する Task の List である。PPE で生成され SPE へ Mail で通知される
TaskList が生成され SPE に通知されるまで、SPE に待ち時間が発生する。
-
Mail の書き込み待ち
Task が終了した際と TaskList が終了した際に SPE が Mailbox へ書き込みを行う(依存関係解決のため)。Outbound Mailbox はサイズが1なので、他のMailが書きこまれてる場合、それが PPE側から読み込まれるまで、待つ。
TaskList が生成され SPE に通知されるまで、SPE に待ち時間が発生する。
-
TaskArray(1/3)
TaskList は Cerium 側で固定長であり、ユーザは変更することができない。ユーザが設定できる TaskList のようなものが、TaskArrayである。TaskArray は複数の Task をグルーピングできる。
-
TaskArray(2/3)
例えば TaskListのサイズが4, TaskArray のサイズが4の場合、Task が8個の場合
グルーピングされるため Task 毎の Mail 回数が減る。TaskList の要求回数が減る。そのため Mail の待ち時間が入る箇所が削減され、Mail の待ち時間自体の削減につながる。
-
TaskArray(3/3)
TaskArray の効果を示す
ballbound
TaskArray |
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
なし |
30.2 |
1.8% |
74.3% |
23.7% |
あり |
32.2 |
2.5% |
66.7% |
30.8% |
panel
TaskArray |
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
なし |
4.0 |
21.3% |
11.1% |
67.6% |
あり |
4.2 |
22.5% |
5.7% |
71.8% |
TaskArray を ball bound, panel の DrawSpanTask に適応。FPS、稼働率の向上。Mail 待ちの時間が削減された
-
MailQueue(1/3)
ソフトウェア MailQueue の実装
- SPE から Mailbox に書き出せない場合に MailQueue へと書きだす
- MailQueue に Mail がある場合は、MailQueue から Mailbox へ書き出す
- MailQueue に残っている Mail は TaskList のTask を消化した時点で、すべて書き出す処理を挟む
Task 毎の Mail 書き込み時の待ち時間を削減するのが目的
-
MailQueue(2/3)
Mailbox に書き込めない場合は、MailQueue に書き込む例
-
MailQueue(3/3)
MailQeueuの効果
ball bound
MailQueue |
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
なし |
32.2 |
2.5% |
66.7% |
30.8% |
あり |
41.7 |
3.3% |
56.8% |
40.0% |
panel
MailQueue |
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
なし |
4.2 |
22.5% |
5.7% |
71.8% |
あり |
4.2 |
23.7% |
4.1% |
72.3% |
-
改良効果のまとめ
ball bound
|
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
改良前 |
30.2 |
1.8% |
74.3% |
23.7% |
改良後 |
41.7 |
3.3% |
56.8% |
40.0% |
panel
|
FPS |
DMA転送待ち時間 |
mail待ちの割合 |
SPE稼働率 |
改良前 |
4.0 |
21.3% |
11.1% |
67.6% |
改良後 |
4.2 |
23.7% |
4.1% |
72.3% |
-
MemorySegment(1/)
CreateSpanTask では明示的にDMA転送命令を記述している。
- 処理するデータ構造上の理由、Task内でのデータロードが必要
- DMA転送命令は Cell アーキテクチャの依存の記述
- 他のアーキテクチャ などでは不要
アーキテクチャ依存の記述を隠蔽できるAPIが必要
-
MemorySegment(2)
MemorySegment を実装
-
まとめ
-
今後の課題
-
自動的な依存関係の解決
-
Task 化による並列化率の向上
-
SPE の LS の利用方法
-
/*end*/