Cerium
108574D 金城裕
指導教官:河野真治
琉球大学大学院理工学研究科情報工学専攻並列信頼研
ゴゴゴゴ
これから語られるのはCeriumに関しての壮大なお話・・・?
うろ覚えな所もありますが、だいたいこんな感じかも
4年次研究室配属
4年次配属になり、
ゲーム班でさわってたから、Cerium やるー。やっふー。
先生のソース変更
でも、Ceriumってなにするんだろー。RenderingEngineのチューニングあたりかなー。
とりあえず、WordCount を TaskManager を使って実装する。
これは比較的優しかった。
先生のソース変更
お次は、RenderingEngineのチューニングあたりかなー。
- Kono先生、TaskManager に、TaskArrayを実装(じばらく、Ceriumは動かない。)
- 動かない -> バグとりしたい -> Cerium を読み始める -> あんまりわかんない
- 進まない -> ゼミ発表「できませんでした!」
- とりあえず、動くバージョンで光源を実装。RenderingEngine を読み始める
TaskArray
TaskArrayとは?
- 複数のTaskをまとめて、依存関係を集約できる。
- Mail待ちのタイミングが減るはず
そして卒研へ
RenderingEngine に光源を実装、spe側ではSIMD演算を実装して、速度向上を計る。
M1に昇格
TaskManager のチューニングにとりかかる
- ついに、先生の手によってTaskArrayがデバックされる
- WordCountnをTaskArrayで実装
- RenderinEngineのDrawSpanTaskもTaskArrayで実装
- 学会で発表。そんなに効果はない
現在
現在
- やっとのことでTaskManagerも理解
- RenderinEngine も読んだので Cerium をようやっと網羅
みえてきたこと・・・
future
今の TaskManager だけだと少し足りない
- プログラミングの際は、できるだけSPEの稼働率を下げないように工夫しないといけない
- (ex.バリア同期を避ける、Taskをパイプライン化、依存関係の集約、PPEにできるだけTaskを任せない)
それらの煩わしい手順を解決するための、TaskManager以外のものが必要なのかも
RenderinEngineの場合だと
- それぞれ, CreatePolygonTask, CreateSpanTask, DrawSpanTask, がバリア同期になっていて、SPEの待ち時間20%
- 毎回ユーザが工夫するのか?なんとかできないかなぁー。
それらの煩わしい手順を解決するための、TaskManager以外のものが必要なのかも
TaskCreater
今ココ。
現在)TaskManager -> ユーザ
提案)TaskManager -> TaskCreater(または何かしらのパターン) -> ユーザ
TaskCreater 機能
- TaskArray化を自動で行う。
- 他にもいろいろできるはず
TaskCreater
WordCount のをうまく抜き出せば、自動的に input を分割 TaskArray化 できるAPIを作れるのでは
input, output の1Dataのsize, Task全体のsize, とそれのスタートアドレスを渡してやれば・・できるはず・
- 1Dataのsize(ex. WordCountならchar, Engineなら pp, spp,等々)
- インクリメンタルな task create は可能?WordCountのをうまく使えば多分できる
- メモリ確保もインクリメンタルにー
今後
- 比較したいので、OpenCL や他のフレームワークを調べてみる。
- もっとTaskManagerを使っていって新しいプログラミングスタイルを編み出す!
- TaskCreater(自動TaskArray化)
- TaskCreater(インクリメンタルな task create)
- 新しいプログラミングスタイルっていうかAPI?..(ちょっとせこい?)
- SDLお勉強
- コツコツやってれば、きっと何か見えてくるのかな。。
END
/*end*/
研究目的
現在 Cell/PS3またはMacOSX上で動作するCerium Task Manager を使って RenderingEngine を実装中である
-
実装方法は各処理を Task という単位にわけ、TaskManager を用いて並列実行していく。
- その際に SPEの稼働率を下げないための工夫が必要であることがわかった。(ex.バリア同期を避ける、Taskをパイプライン化、依存関係の集約、PPEにできるだけTaskを任せない)
それらの煩わしい手順を解決するための、TaskManagerを用いたプログラミングスタイルを提案する
研究背景
それでですね。ここらへんで、OpenCL 等の他のフレームワークや、アムダール則について書きたいんです。
なんですが、OpenCL を使ってCellでプログラミングしたことがないので、ちょっと書けない。これから他のフレームワークも調べたい。
Mail timing
学会前に自分がいじったせいか、mail のタイミングでバグがありました。
Mail timing
(前)SchedNop2Ready -> SchedMail
(後)SchedNop2Ready -> SchedNop -> SchedMail
Mail Queue
Mail Queue を MailManager を使ったものに書き換え。
Mail Queue をさっそく計測。。特に実行時間は変わらず^^;
Task list mail Time
SPE が TaskList の要求 mail の待ち時間を表示するようにしました。
(demo)
mail time の ほとんどが task list の待ち時間。
RenderinEngine
mail time の待ち時間 がほんとんど task list 待ちなら。
解決すべきは、TaskManager側ではなく、Engine 部分のバリア同期
SDL
がんばってほんとにいろいろぐぐったり、したんですが・・
./configure --enable-ps3-video
みたいなオプションしか分からない。んで、いろいろ探しているうちに・・
SDL
Hello.
This patch provides basic support for video on the Sony PS3
Linux framebuffer. Scaling, format-conversion, and drawing is
done from the SPEs, so there is little performance impact to
PPE applications. This is by no means production quality code,
but it is a very good start and a good example of how to use the
PS3's hardware capabilities to accelerate video playback on
the box.
SDL
The driver has been verified to work with ffplay, mplayer and xine.
This piece of software has been developed at the IBM R&D Lab
in Boeblingen, Germany and is now returned to the community.
Enjoy !
SDL
これ以上のことがわらないので、また少しソース読みはじめました・・。
ps3 driver って動かないのかも・・
やること
とくかく、SDLのやつなんとしないといけない。
もっと詳しく調べます
今後
比較したいので、OpenCL や他のフレームワークを調べてみる。
法線ベクトルもOpenGL と合うように、blender から見直す
もっとTaskManagerを使っていって新しいプログラミングスタイルを編み出す!
END
/*end*/
参照の局所性
RenderinEngine の場合、mail待ちの時間が大きな問題ですが。
WordCount 実装時に、SPEが同時にバラバラのメモリにアクセス、パーフォーマンスがいっきに低下したことがある。
データの局所性がなりたたない時がある。
- memory allocate の工夫
- Task の allocate はすでにQueueになっている
- 独自のアロケータを用いてある程度の大きさまでしか確保しない、処理してる間に次の領域を確保
- そこらへん勝手にやってくれると助かる。もっと勉強(既存のmalloc等々)
- いろいろ考えてみたい。工夫の余地がある。
参照の局所性
大量のデータ、簡単な処理をSPEで行う場合にパイプラインで隠れないことがあるのかも。
- Taskの領域のすぐ近くに必要なread bufferやout bufferを確保する
- なるべく実行される順にデータの領域が確保される方がいい
- それは Task からヒントをもらえる?
- rbuf のアドレスは固定、TaskからDMA命令がきたときに、またはそれを予測して、ユーザが確保したデータを移し替える
end
/*end*/
Mandelbrot
|
real_time |
wait_time |
mail_time |
busy_ratio |
all |
58s(-0) |
62(-15)% |
32%(+15) |
5.5%(-0) |
compatibility |
24s(-7) |
79%(+19) |
17%(-22) |
13%(+3) |
taskarray |
28s(-6) |
66%(+31) |
22%(-33) |
11%(+2) |
速度比較(RUN_TASK_BLOCK を二つ生成)
Mandelbort
MandelbrotをCeriumに実装
こっちも、まだセグメンテーションエラーです。
バグとり間に合わず。
バグとり
というわけで、WordCountのTaskArray,ネックの検証
MandelbrotのCerium実装
引き続きもうちょっと頑張ります。
ダブルバッファリング
TaskListしたので、ダブルバッファリングしやすかった。次のタスクのアドレスがわかるので、
現Taskを処理している間に次のTaskをdma_get,前のTaskのoutputをdma_putする。
例題
という実装をしたところで、マンデルブロー集合を計算してみました。demoあり
今後
現在、SPE側のrun関数が決め打ちで動き、それがtaskという事になっている。
Cerium/TaskManager のように複数のTaskから指定して動くようにしたい。あとTaskの依存関係も。
MemorySegment!やります!
end
[any material that should appear in print but not on the slide]