Mercurial > hg > Papers > 2018 > parusu-master
changeset 36:1008821ac2c7
Add semaphore section
author | Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 04 Feb 2018 16:48:05 +0900 |
parents | c38a9829b231 |
children | 506cc13ed747 |
files | paper/evaluation.tex paper/fig/sendTask.graffle paper/fig/sendTask.pdf paper/fig/sendTask.xbb paper/master_paper.pdf paper/parallelism_gears.tex |
diffstat | 6 files changed, 48 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/evaluation.tex Sat Feb 03 22:50:34 2018 +0900 +++ b/paper/evaluation.tex Sun Feb 04 16:48:05 2018 +0900 @@ -132,3 +132,7 @@ GPU では通信時間を含めると 8 CPU の約1.16倍となり、 kernel のみの実行では 32 CPU の約11.48倍となった。 現在の Gears OS の CUDA 実装では、 Output Data Gear を書き出す際に一度 GPU から CPU へ kernel の実行結果の書き出しを行っており、その処理の時間で差が出たと考えられる。 GPU で実行される Task 同士の依存関係の解決の際はCuDevicePtr などのGPU のメモリへのポインタを渡し、CPU でデータが必要になったときに初めて GPU から CPU へデータの通信を行うメタ計算の実装が必要となる。 + +\section{OpenMP との比較} + +\section{Go との比較}
--- a/paper/fig/sendTask.xbb Sat Feb 03 22:50:34 2018 +0900 +++ b/paper/fig/sendTask.xbb Sun Feb 04 16:48:05 2018 +0900 @@ -1,8 +1,8 @@ %%Title: fig/sendTask.pdf %%Creator: extractbb 20170318 -%%BoundingBox: 0 0 1043 171 -%%HiResBoundingBox: 0.000000 0.000000 1043.000000 171.000000 +%%BoundingBox: 0 0 722 374 +%%HiResBoundingBox: 0.000000 0.000000 722.000000 374.000000 %%PDFVersion: 1.3 %%Pages: 1 -%%CreationDate: Thu Jan 25 15:41:12 2018 +%%CreationDate: Sun Feb 4 00:31:04 2018
--- a/paper/parallelism_gears.tex Sat Feb 03 22:50:34 2018 +0900 +++ b/paper/parallelism_gears.tex Sun Feb 04 16:48:05 2018 +0900 @@ -215,7 +215,47 @@ Gears OS の Task は Output Data Gear を生成した時点で終了するので、par goto では直接 \_\_exit に継続するのではなく、Output Data Gear への書き出し処理に継続される。 これにより Code Gear と Data Gear の依存関係をノーマルレベルで記述できるようになる。 -\section{待ち機構} +\section{Task(Context) 間の同期処理} +Gears OS では複数の Task(Context) から同じ Output Data Gear を修正する場合がある。 +その際に適切な同期処理を行わずそのまま実行すると Output Data Gear の整合性が取れない場合がある。 + +そこで 複数のTask 間の同期処理 Semaphore を用意した。 +Semaphore の Interface を \coderef{semaphoreInterface} に示す。 + +\lstinputlisting[caption=Semaphore Interface, label=code:semaphoreInterface]{./src/semaphoreInterface.h} + +Semaphore はある資源に対してアクセスできるスレッドの数を制限するものであり、P命令 と V命令がある。 +P命令は資源の消費に相当し、V命令が資源の開放に相当する命令である。 +P命令を行う際、資源がなければ V命令で開放されるまでそのスレッドは処理を停止する。 + +Gears OS の Context はスレッドに相当するため、 Gears OS 上で Semaphore を実装することは Context の停止を実装する必要がある。 +Gears OS の Semaphore は Context の停止を停止用の待ち Queue を使って行う。 + +\figref{semaphoreSequence} に資源が1つのSemaphore に2つのContext が P命令を実行しているシーケンス図を示す。 + +\begin{figure}[htbp] + \begin{center} + \includegraphics[scale=0.4]{./fig/semaphoreSequence.pdf} + \end{center} + \caption{Gears OS 上 Semaphore} + \label{fig:semaphoreSequence} +\end{figure} + +\figref{semaphoreSequence} の処理の流れを以下に示す。 + +\begin{enumerate} + \item Context1 が Semaphore に対して P命令を実行する。 + Semaphore には資源が残っているので資源を消費する + \item Context2 が Semaphore に対して P命令を実行する。 + この時、Semaphore に資源が残っていないので Context を Seamphore が持っている待ち Queue に追加する。 + その後はContext2 を取得していた Worker に処理を移譲する。 + \item Context1 が Semaphore に対して V命令を実行する。 + Semaphore の資源を開放しつつ、 待ち Queue に Context があるかの確認を行う。 + Context があった場合 1つ Context を 待ち Queue から取得し、TaskManager に Context の実行を行う命令を実効する。 +\end{enumerate} + +TaskManager 送られた Context は Worker で取得される。 +取得された Context は停止した時の状態を記録しているため、停止した Code Gear である P命令を再び実行する。 \section{データ並列} 並列プログラミングを行う際、並列化の方式としてタスク並列とデータ並列の2つがある。