# HG changeset patch # User Tatsuki IHA # Date 1492845808 -32400 # Node ID 8e5011d1947d529ce03ebe3f81d48fc19beff1e9 # Parent 6cd7ad437a85bc571650c74fac0d401ae4c0ca15 Add par goto diff -r 6cd7ad437a85 -r 8e5011d1947d paper/pic/gears_structure.graffle Binary file paper/pic/gears_structure.graffle has changed diff -r 6cd7ad437a85 -r 8e5011d1947d paper/pic/gears_structure.pdf Binary file paper/pic/gears_structure.pdf has changed diff -r 6cd7ad437a85 -r 8e5011d1947d paper/sigos.pdf Binary file paper/sigos.pdf has changed diff -r 6cd7ad437a85 -r 8e5011d1947d paper/sigos.tex --- a/paper/sigos.tex Fri Apr 21 21:23:59 2017 +0900 +++ b/paper/sigos.tex Sat Apr 22 16:23:28 2017 +0900 @@ -102,7 +102,6 @@ Code Gear は処理の基本として、 Input Data Gear を参照し、一つまたは複数の Output Data Gear に書き込む。また、接続された Data Gear 以外には参照を行わない。(図\ref{fig:codeGear_dataGear}) Input Data Gear と Output Data Gear の2つによって、Code Gear の Data に対する依存関係が解決し Code Gear の並列実行を可能とする。 -\end{itemize} \begin{figure}[ht] \begin{center} \includegraphics[width=60mm]{./pic/codeGear_dataGear.pdf} @@ -133,7 +132,6 @@ \end{figure} -\newpage %図で言うよりも goto の説明をしたほうがわかりやすいかも、gotoがどういったものでどういう事に使われているのか、これがわかればわかるのでは? \section{GearsOSの構成} @@ -150,16 +148,26 @@ また、 並列実行を行う際はこの Context を生成し、それを Task として実行する。 そのため、 Context は 接続に必要な Code/Data Gear のリスト、 Data Gear を確保するためのメモリ空間、 実行する Code Gear、 Code Gear の実行に必要な Input Data Gear のカウンタ等をもっている。 -TaskManager は Task、 Worker の生成、 Worker に 実行する Task を送信を行う。 -また、 生成した Worker の終了処理等を行う。 +TaskManager は Task、 Worker の生成、 Worker に生成した Task を送信する。 +また、生成した Worker の終了処理等を行う。 -Worker は thread と 実行するTaskが入っているQueueを持っている。 -Worker は TaskManager から送信された Task を Queue から取り出し、Code Gear, Input Data Gear を取り出し、 Code Gearを実行する。 +Worker は thread と実行する Task が入っているQueueを持っている。 +Worker は TaskManager から送信された Task を Queue から取り出し、Code Gearを実行する。 +Task は Context なので、Code Gear の実行に必要な Input Data Gear はその Context から参照される。 Code Gear を実行した後は出力される Output Data Gear から依存関係を解決する。 Gears OS の並列処理の構成を図\ref{fig:gears_structure}に示す。 %\lstinputlisting[label=src:sync\_dequeue, caption=sync\_dequeue.c]{./src/sync\_dequeue.c} +\begin{figure}[ht] + \begin{center} + \includegraphics[width=70mm]{pic/gears_structure} + \end{center} + \caption{並列処理の構成} + \label{fig:gears_structure} +\end{figure} + + \section{並列処理の依存関係の解決} Gears OS の並列処理の依存関係の解決は Data Gear に依存関係解決のための Queue をもたせることで行う。 Queue にはその Data Gear を Input Data Gear として使用する Task(Context) が入っている。 @@ -200,7 +208,6 @@ \caption{Gears OS による GPGPU} \label{fig:gpgpu} \end{figure} -\newpage % CPUからGPUにTaskを振り分ける図があってもいい \section{CUDA} @@ -224,10 +231,19 @@ CUDAライブラリの初期化を行う以外の動作はCUDAWorker と全く同じになる。 GPUへのデータ転送及びGPU側でのTaskの実行はTaskのMeta Code Gear で行われる。 +% session 名変えたい +\section{Task の設定の Meta Computation の問題} +現在の Gears OS では 並列実行する Task の設定を Code\ref{src:setting_task} のように行っている。 +Code\ref{src:setting_task} では 実行する CodeGear、揃っていない Input Data Gear の数、Input/Output Data Gear への参照等の設定をノーマルレベルで記述している。 +しかし、この記述方法では Meta Data Gear である Task(Context) を直接参照しているため、ノーマルレベルとしては好ましくなく、 メタレベルでの記述を行いたい。 +そこで、 Code\ref{src:par_goto} のような goto の記述方法を新たに考案した。 +par goto は Code\ref{src:setting_task} に変換される記述である。 +この記述を行うことで、ノーマルレベルでは直接 Task を参照せずに par goto の引数で Task の設定を行うことが出来る。 +また、この記述を拡張することで、 CPU、 GPU での実行の切り替え等を行うことが可能であると考える。 -\newpage - -%今後の課題 +% この例題微妙かなぁ +\lstinputlisting[label=src:setting_task, caption=createTask]{./src/setting_task.c} +\lstinputlisting[label=src:par_goto, caption=parGoto]{./src/par_goto.c} \section{結論} \section{まとめ} diff -r 6cd7ad437a85 -r 8e5011d1947d paper/src/par_goto.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/par_goto.c Sat Apr 22 16:23:28 2017 +0900 @@ -0,0 +1,3 @@ +__code createTask(Integer *integer1, Integer *integer2, Integer *output) { + par goto add(integer1, integer2, output); +} diff -r 6cd7ad437a85 -r 8e5011d1947d paper/src/setting_task.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/setting_task.c Sat Apr 22 16:23:28 2017 +0900 @@ -0,0 +1,17 @@ +__code createTask(TaskManager* taskManager, Context* task, Integer *integer1, Integer *integer2, Integer *output) { + task->next = C_add; // set Code Gear + task->idgCount = 2; // set Input Data Gear Counter + task->data[task->idg] = (union Data*)integer1; // set Input Data Gear reference + task->data[task->idg+1] = (union Data*)integer2; + task->maxIdg = task->idg + 2; + task->odg = task->maxIdg; // Output Data Gear index + task->data[task->odg] = (union Data*)output; // set Output Data Gear reference + task->maxOdg = task->odg + 1; + taskManager->next = C_createTask1; + goto meta(context, taskManager->taskManager->TaskManager.spawn); // spawn task +} + +// code gear +__code add(Integer *integer1, Integer *integer2, Integer *output) { + .... +}