# HG changeset patch # User Shinji KONO # Date 1317097715 -32400 # Node ID 55787a891c8ae429fe79b6f785f63652113fe157 # Parent 4b0a368cc8583383bdba3a995f9b9d85a93ce7a6 fix diff -r 4b0a368cc858 -r 55787a891c8a presentation/datasegment.ind --- a/presentation/datasegment.ind Mon Sep 26 10:38:35 2011 +0900 +++ b/presentation/datasegment.ind Tue Sep 27 13:28:35 2011 +0900 @@ -1,26 +1,84 @@ -title: Cerium における DataSegment API の設計 --author: 金城裕 and 河野真治 +-author: 金城裕 河野真治 --affiliation: 琉球大学 --Cell用TaskManager Cerium +Cellの6 SPUのTask をパイプラインで管理する +Open CL と似たフレームワーク。 + +並列プログラムの例題や、ゲームプログラムを作成してきた。 + もう、Linux が PS3 で動かないのでやっても意味がない。 -Open CL と似てる。 --Cerium, Open/CLでの並列プログラミングの問題点 Task の取り扱うデータ型が示されない Task 自体は簡単だが Task を構成する方法が繁雑 - Open CL\cite{opencl} に比べても構文的に複雑 + Open CL に比べても構文的に複雑 Task の種類が複雑 Task の依存関係の記述がデータの依存関係と無関係 Task Scheduler が大きくメモリを圧迫 C++ と Task 記述の相性が良くない Task Manager が複雑になりすぎ +--Task の取り扱うデータ型が示されない + + + static int + run(SchedTask *s, void* rbuff, void* wbuff) { + + int end = s->get_inputSize(0)/sizeof(Data); + DataPtr r_data = (DataPtr)s->get_input(0); + +void* で受けてしまうので型チェックができない。 + +-- Task 自体は簡単だが Task を構成する方法が繁雑 + + int i = s->split_num-1; + + s->fsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num, + (memaddr)&s->data[i*block_num], sizeof(Data)*last_block_num); + if (i>0 && s->bsort[i-1]) { + s->fsort[i]->wait_for(s->bsort[i-1]); + } + s->fsort[i]->set_cpu(SPE_ANY); + +Open CL に比べても構文的に複雑 + +-- Task の種類が複雑 + + SimpleTask read と write が一つ + Task read と write が8個まで + ArrayTask read と write が任意個、ひと続きで実行される + MainTask ppe で動作、Task生成が可能 + +--Task の依存関係の記述がデータの依存関係と無関係 + + for (int i = 0; i < s->split_num-1; i++) { + s->fsort[i] = manager->create_task(QUICK_SORT, + (memaddr)&s->data[i*block_num], sizeof(Data)*block_num, + (memaddr)&s->data[i*block_num], sizeof(Data)*block_num); + if (i>0 && s->bsort[i-1]) { + s->fsort[i]->wait_for(s->bsort[i-1]); + } + if (isplit_num-2 && s->bsort[i]) { + s->fsort[i]->wait_for(s->bsort[i]); + } + s->fsort[i]->set_cpu(SPE_ANY); + +--その他 + + Task Scheduler が大きくメモリを圧迫 + + C++ と Task 記述の相性が良くない + + Task Manager が複雑になりすぎ + --Continuation based C 関数呼び出しの代わりに goto を持つ C @@ -39,8 +97,12 @@ +これを並列に実行する。 + +code segment を並べ替えて、分散通信したりスケジューリングしたい + --再接続の問題 @@ -50,6 +112,8 @@ +--再接続の問題 + 汎用の型でないと再接続できない。 @@ -78,13 +142,38 @@ GPGPUでも、通常のCPUでも両方で動かしたい。ポインタでは困る。 ---Task の生成 +Code Segment は ID で指定する。番号。 + 実行CPUも指定できる + 分散フレームワークでは、Geo Addressing を使用。 + +--get_segment, put_segment -Cerium では、メインCPUで動くTaskでしか Task を生成できなかった。 +Cell / SPU では、ローカルメモリ + +read, write 以外に実行時に必要なデータもある。 + + get_segment + wait_segment + +で Cache / LRU 的に取得する。 -SPU側にあまり複雑な Kernel を置けない。(256kb しかメモリがない) + smanager->wait_segment(span_put_ms); + + span_put_ms = span_get_ms; + smanager->put_segment(span_put_ms); + + span_get_ms = smanager->get_segment((memaddr)spackList[index], span_ml); + smanager->wait_segment(span_get_ms); ---Data Segement の型 + prev_index = index; + spack = (SpanPackPtr)span_get_ms->data; + + +--Data Segement + + get_segment で全部実装した方が良い? + + Data Segment として API を整理しよう。 Json で表す @@ -101,6 +190,8 @@ update delete +KVS 的にアクセスする。 + --Data Segment 更新の Atomicity Queuing @@ -109,6 +200,8 @@ 生成された Data segment は synchronized queue として使うことができる。 + + ---Task Dependendcy Cerium では、 @@ -118,17 +211,37 @@ としていたが、繁雑。Data dependency が自然に依存関係を決めるので、それを 使うのが良い。 +Data segment を Code segment に割り当てた時に、自動的に dependency が決まる。 + + Data segment -> Code segment -> Datas segment + ---Data Segment Storage Type +Data segment は様々な場所に置ける。 + Main Memory Local Memory Cache Memory Persitent Store +Code segment からは、指定された Data segment にしかアクセスできない。 + +--まとめ + +PS3 Cell 用のTaskMangaer Cerium の利点/欠点を考察し、 + +Data Segment と Code Segment を用いた新しいフレームワークを提案した。 + +Continuation based C と組み合わせる + +分散計算にも同様のAPIを用意し、並列環境でも分散環境でも共通に使える + +フレームワークを作成したい。 + diff -r 4b0a368cc858 -r 55787a891c8a presentation/fig/DSCS.jpg Binary file presentation/fig/DSCS.jpg has changed