title: Gears author: Tatsuki IHA profile: lang: Japanese code-engine: coderay ## 研究目的 - 当研究室では 処理の単位を Code Gear、 データの単位を Data Gear を用いて 信頼性が高い並列処理を行う Gears OS を開発している - Gears OS では Task を Code Gear と実行するときに必要な Input Data Gear と出力するための Output Data Gear の組で表現される。 Input Data Gear/Output Data Gear によって依存関係が決定し、それにそって並列実行を行う. - 依存関係の解決やモデル検査等の本論の計算を行うためのメタな計算を Meta Code Gear で行う. - 現在のGears は 依存関係がある並列処理を行うことが出来ない。 今研究ではGears OS の依存関係の解決を目標とする ## 進捗 - dependency の例題書いてみました - 加算した output を 乗算の input にする - (1+2) * 3 みたいな ## Gears の構成 ## 依存関係があるTask の生成 - ds に依存するtaskをセットする ``` __code createTask2(LoopCounter* loopCounter, TaskManager* taskManager, struct Context *task, Integer *integer1, Integer *integer2, Integer *integer3) { int i = loopCounter->i; task->idgCount = 1; task->next = C_mult; integer2->value = i; task->data[task->idg] = (union Data*)integer1; task->data[task->idg+1] = (union Data*)integer2; task->maxIdg = task->idg + 2; task->odg = task->maxIdg; task->data[task->odg] = (union Data*)integer3; task->maxOdg = task->odg + 1; taskManager->task = task; taskManager->next = C_createTask3; taskManager->data = (union Data*)integer1; goto meta(context, taskManager->taskManager->TaskManager.setWaitTask); } ``` ## 依存関係のあるtaskをList にsetする ``` __code setWaitTask(struct Queue* queue, struct Context* task, Data* data, __code next(...)) { queue->queue = (Data *)GET_WAIT_LIST(data); queue->next = next; queue->data = (Data *)task; goto meta(context, queue->queue->Queue.put); } ``` ## output Data Gear Commit - ds から wait list を取り, empty でなければ, wait list から taskを取り出し, idgCount をデクリメントする - idgCount が 0になった, spawn する ``` __code odgCommit1(struct LoopCounter* loopCounter, struct Queue* queue) { int i = loopCounter->i ; queue->queue = (union Data*)GET_WAIT_LIST(context->data[context->odg+i]); queue->whenEmpty = C_odgCommit4; queue->next = C_odgCommit2; goto meta(context, queue->queue->Queue.isEmpty); } __code odgCommit3(struct TaskManager* taskManager, struct Context* task) { if(__sync_fetch_and_sub(&task->idgCount, 1)) { if(task->idgCount == 0) { taskManager->taskManager = (union Data*)task->taskManager; taskManager->context = task; taskManager->next = C_odgCommit1; goto meta(context, task->taskManager->spawn); } else { goto meta(context, C_odgCommit1); } } else { goto meta(context, C_odgCommit3); } } ``` ## で? 動いているの? - assert を仕込んで確認すると動いてるっぽい ## まだ解決してない点 - multi thread - 複数のCSから同一のDSに書き出した場合の merge 処理 - API (par goto?) - meta の分離(idgCount をデクリメントする前の cas等)