Mercurial > hg > Papers > 2014 > masakoha-sigos
changeset 23:16055efb3794
fix
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Apr 2014 17:05:59 +0900 |
parents | 8ee210e890f6 |
children | 84383e5e2e85 |
files | paper/io.tex paper/sigos.pdf |
diffstat | 2 files changed, 45 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/io.tex Tue Apr 22 16:35:47 2014 +0900 +++ b/paper/io.tex Tue Apr 22 17:05:59 2014 +0900 @@ -115,7 +115,7 @@ \label{fig:block} \end{figure} -この図では、Read Task 1つに対して WordCount を1つ起動しているが、このように1つ1つ生成、起動をすると Task 生成でメモリを圧迫してしまい、全体的な動作に影響を与えてしまう。 +図\ref{fig:block}では、Read Task 1つに対して WordCount を1つ起動しているが、このように1つ1つ生成、起動をすると Task 生成でメモリを圧迫してしまい、全体的な動作に影響を与えてしまう。 実際には Task をある一定数まとめた単位で生成し、起動を行っている。この単位を Task Block と定義する。 Task Block 1つ当たりがの Task 量を $n$ とおく。Task 1つ当たりの読み込む量を $L$ とすると、Task Block 1つ当たりの読み込む量は $L \times n$ となる。 @@ -123,7 +123,6 @@ Task Block が Blocked Read よりも先走ってしまうと、 まだ読み込まれていない領域に対して処理を行ってしまうので、正しい結果が返ってこなくなってしまう。 それを防止するために、Blocked Read が読み込み終わってから Task Block が起動されるように Cerium の API である wait\_for にて依存関係を設定する。 -(図\ref{fig:block}) \begin{figure}[htbp] \begin{center} @@ -155,17 +154,51 @@ \end{verbatim} -set\_cpu にて Read Task を担当するデバイスの設定を行う。 -set\_outData(0) にファイルを読み込んだときの格納場所を指定し、set\_param(0) にて読み込むファイルディスクリプタを設定している。 -set\_param(1) 、 set\_param(2) にて Blocked Read Task 単体で読み込むファイルの範囲の先頭と末尾のポジションを設定する。 +% \begin{verbatim} +% +% SchedDefineTask1(BREAD_RUN_TASK_BLOCKS,bread_run16); +% +% bread_run16(SchedTask *manager, void *in, void *out) +% { +% WordCount *w = *(WordCount **)in; +% HTaskPtr t_read = +% manager->create_task(READ_TASK); +% w->t_print->wait_for(t_read); +% t_read->set_cpu(DEVICE_TYPE); +% t_read->set_param(0,fd); +% +% if (w->task_num >= w->task_blocks) { +% HTaskPtr t_next = +% manager->create_task(BREAD_RUN_TASK_BLOCKS, +% (memaddr)&w->self,sizeof(memaddr),0,0); +% } +% +% t_read->set_outData(0, +% file_mmap + task_num * division_size, +% task_blocks * division_size); +% t_read->set_param(1,task_num*division_size); +% +% run_tasks(manager,w, w->task_blocks, +% t_read, t_next, w->division_size); +% +% t_read->set_param(2,task_num*division_size); +% w->t_print->wait_for(t_next); +% t_read->spawn(); +% } +% \end{verbatim} -Cerium の Task は、最初に word count に必要な Task を全部起動してしまうと、そのTaskを表すデータ構造自体がメモリを消費してしまう。 +\verb+set_cpu+ にて Read Task を担当するデバイスの設定を行う。 +\verb+set_outData(0)+ にファイルを読み込んだときの格納場所を指定し、\verb+set\_param(0)+ にて読み込むファイルディスクリプタを設定している。 +\verb+set_param(1)+ 、\verb+set\_param(2)+にて Blocked Read Task 単体で読み込むファイルの範囲の先頭と末尾のポジションを設定する。 + +Cerium の Task は、最初に WordCount に必要な Task を全部起動してしまうと、そのTaskを表すデータ構造自体がメモリを消費してしまう。 そこで、既にある程度の量の Task を起動し、それが終了してから(正確には、終了する前に)次のTaskを生成するようになっている。 これが \verb+run_tasks+ である。 そこの部分にファイルを読み込む Task との待ち合わせを入れれば良いので、実装は比較的容易にできる。 \verb+run_tasks+ の中で、\verb+READ_TASK+ に対する待ち合わせを \verb+wair_for()+ を使って実現している。 + Blocked Read Task の記述は以下のようになる。 \begin{verbatim} @@ -196,8 +229,8 @@ \subsection{I/O 専用 thread の実装} Cerium Task Manager では、各種 Task にデバイスを設定することができる。 -SPE\_ANY という設定を使用すると、Task Manager で CPU の割り振りを自動的に行う。 -Blocked Read 、Task それぞれに SPE\_ANY にてデバイスの設定を行うと、Task Manager 側で自動的に CPU を割り当てられ、本来 Blocked Read は連続で読み込むはずが、他の Task を割り当てられてしまう。 +\verb+SPE_ANY+ という設定を使用すると、Task Manager で CPU の割り振りを自動的に行う。 +Blocked Read 、Task それぞれに \verb+SPE_ANY+ にてデバイスの設定を行うと、Task Manager 側で自動的に CPU を割り当てられ、本来 Blocked Read は連続で読み込むはずが、他の Task を割り当てられてしまう。 (図\ref{fig:speany}) \begin{figure}[htbp] @@ -208,24 +241,12 @@ \label{fig:speany} \end{figure} -この問題を解決するため、Task Manager に新しく I/O 専用の thread 、 IO\_0 の追加を行った。 +この問題を解決するため、Task Manager に新しく I/O 専用の thread 、 \verb+IO_0+ の追加を行った。 -%(図\ref{fig:addio0}) -%%この問題を解決するために、Task Manager に IO\_0という新しいデバイス設定を追加した。 -% -% -%\begin{figure}[htbp] -%\begin{center} -%\includegraphics[scale=0.5]{images/addio_0.pdf} -%\end{center} -%\caption{IO\_0 の追加} -%\label{fig:addio0} -%\end{figure} - -IO\_0 は、SPE\_ANY とは、別なスレッド動いているスケジューラーで動くので、 -SPE\_ANY で動いている 文字列検索 Task に割り込まれることはない。 +\verb+IO_0+ は、\verb+SPE_ANY+ とは、別なスレッド動いているスケジューラーで動くので、 +\verb+SPE_ANY+ で動いている WordCount に割り込まれることはない。 しかし、読み込みが完了した時に、その完了を通知し、次の read を行う時に、他の計算スレッドにスレッドレベルで割り込まれてしまうと、全体の計算が待たされてしまう。 -そこで、 pthread\_getschedparam()でIO\_0 の priority を設定している。 +そこで、 \verb+pthread\_getschedparam()+で\verb+IO_0+ の priority を設定している。 IO thread は計算はほとんどしないので、高い優先順位を割り当てても他の計算を行うスレッドには影響しない。 IOを含む処理では IOを行うスレッドの優先順位を高くする必要があるということである。 (図\ref{fig:io0})