Mercurial > hg > Papers > 2016 > masa-master
changeset 16:a3c5125aea03
add images
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 20 Jan 2016 17:02:45 +0900 |
parents | c686d33ba1c7 |
children | ea3e6f3219a5 |
files | .hgignore c2.tex c3.tex c4.tex c5.tex images/implementation/CharClassMergePattern.bb images/implementation/ccinsert1.bb images/implementation/ccinsert1.pdf images/implementation/ccinsert2.bb images/implementation/ccinsert2.pdf images/implementation/ccinsertresult.bb images/implementation/ccinsertresult.pdf images/implementation/cfab.bb images/implementation/cfab.pdf images/implementation/cfdg.bb images/implementation/cfdg.pdf images/implementation/cfdgab.bb images/implementation/cfdgab.pdf images/implementation/dfa.bb images/implementation/dfa.pdf images/implementation/efgi.bb images/implementation/efgi.pdf images/implementation/nfa.bb images/implementation/nfa.pdf paper.mm |
diffstat | 25 files changed, 201 insertions(+), 144 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,1 @@ +.DS_Store
--- a/c2.tex Wed Jan 20 16:16:46 2016 +0900 +++ b/c2.tex Wed Jan 20 17:02:45 2016 +0900 @@ -142,90 +142,6 @@ Input/Output Data、Parameter は関数の引数に相当する。 Cpu Type は Task を動作させるデバイスを設定することができ、Dependency は他の Task との依存関係を設定することができる。 -\newpage -\section{並列処理向け I/O} -ファイル読み込みなどの I/O を含むプログラムは、読み込み時間が Task の処理時間と比較してオーバーヘッドになることが多い。 -計算処理の並列化を図ったとしても I/O がボトルネックになってしまい処理全体が高速にならない。 -本項では Cerium に実装した並列処理用 I/O を行ない、I/O 部分の高速化を図った。 -Cerium の例題ではファイル読み込みを mmap にて実装していた。 -しかし、mmap だとファイルを読み込んでから Task を実行するので、読み込んでいる間は他の CPU が動作せず並列度が落ちる。 - -mmap は function call 後にすぐにファイルを読みに行くのではなく、仮想メモリ領域にファイルの中身を対応させる。 -その後メモリ空間にアクセスされたときに、OS が対応したファイルを読み込む。 -また、読み込む方法が OS 依存となってしまうため環境に左右されやすく、プログラムの書き手が読み込みの制御をすることが難しい。 - -図\ref{fig:mmap}は mmap で読み込んだファイルに対して Task1 、 Task2 がアクセスしてそれぞれの処理を行うときのモデルである。 - -Task1 が実行されると仮想メモリ上に対応したファイルが読み込まれ、読み込み後 Task1 の処理が行われる。 -その後 Task2 も Task1 と同様の処理が行われるが、これら 2 つの Task の間に待ちが入る。 - -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.7]{images/cerium/mmap.pdf} - \end{center} - \caption{mmap Model} - \label{fig:mmap} -\end{figure} - -mmap を使わず、読み込みを独立した Thread で行ない、ファイルを一度に全て読み込むのではなくある程度の大きさ(Block)分読み込み、読み込まれた部分に対して並列に Task を起動する。 -これを Blocked Read と呼び、高速化を図った。 - -Blocked Read を実装するにあたり、WordCount を例題に挙げる。 -ファイルを読み込む Task (以下、ReadTask) と、読み込んだファイルに対して計算を行う Task (以下、WordCount) を別々に生成する。ReadTask は一度にファイル全体を読み込むのではなく、ある程度の大きさで分割してから読み込みを行う。分割して読み込んだ範囲に対して WordCount を行う。 - -WordCount を Blocked Read で読み込み処理をしたとき以下の図\ref{fig:BlockedRead}の様になる。 - -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.5]{./images/cerium/blockedread.pdf} - \end{center} - \caption{BlockedRead による WordCount} - \label{fig:BlockedRead} -\end{figure} - -Task を一定の単位でまとめた Task Block ごとに生成して WordCount を行なっている。 -Task Block で計算される領域が Blocked Read で読み込む領域を追い越して実行してしまうと、まだ読み込まれていない領域に対して計算されてしまう。 -その問題を解決するために依存関係を適切に設定する必要がある。 -Blocked Read による読み込みが終わってから TaskBlock が起動されるようにするため、Cerium の API である wait\_for にて依存関係を設定する。 - -また、ReadTask は連続で処理される必要がある。 -なぜならば、ReadTask でファイルを読み込む前提で WordCount がその領域に対して計算を行うので、ReadTask の処理が遅くなってしまうだけでオーバーヘッドとなってしまう。\ref{fig:BlockedReadModel} - -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.5]{./images/cerium/blockedreadimage.pdf} - \end{center} - \caption{BlockedRead Model} - \label{fig:BlockedReadModel} -\end{figure} - -\newpage -Blocked Read を実装することにより、読み込み部分と処理部分の並列化を行なった。Blocked Read は連続で読み込まれる必要があるため、さらに I/O 専用 thread を実装した。 - -Cerium Task Manager では、それぞれの Task に対してデバイスを設定することができる。 -SPE\_ANY 設定をすると、Task Manager が CPU の割り振りを自動的に行う。 -Blocked Read は連続で読み込まれなければならないが、SPE\_ANY で設定すると Blocked Read 間に別の Task が割り込まれる恐れがある。(図\ref{fig:spe_any_blockedread}) - -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.7]{./images/cerium/speblockedread.pdf} - \end{center} - \caption{BlockedRead と Task を同じ thread で動かした場合} - \label{fig:spe_any_blockedread} -\end{figure} - -Task が Blocked Read 間に割り込まれないようにするため、I/O 専用 thread である iO\_0 の設定を追加した。 - -IO\_0 は SPE\_ANY とは別 thread の scheduler で動作するので、SPE\_ANY で動作している Task に割り込むことはない。 -しかし、読み込みの終了を通知し、次の read を行う時に他の Task がスレッドレベルで割り込んでしまう事がある。 -pthread\_getschedparam() で IO\_0 の priority の設定を行う必要がある(図:\ref{fig:iothread_blockedread})。 -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.7]{./images/cerium/iothread.pdf} - \end{center} - \caption{IO Thread による BlockedRead} - \label{fig:iothread_blockedread} -\end{figure} - -IO\_0 で実行される Task は Blocked Read のみで、さらに IO\_0 の priority を高く設定することにより Blocked Read が他の Task に割り込まれることなく連続に実行される。 +\section{Cerium における Task} +\section{Task Scheduling}
--- a/c3.tex Wed Jan 20 16:16:46 2016 +0900 +++ b/c3.tex Wed Jan 20 17:02:45 2016 +0900 @@ -1,86 +1,86 @@ -\chapter{正規表現の設計と実装} -\section{正規表現構文木の生成} -\section{Transition List の生成} -\section{Subset Construction} -\section{Cerium 上での実装} +\chapter{並列処理向け I/O} +ファイル読み込みなどの I/O を含むプログラムは、読み込み時間が Task の処理時間と比較してオーバーヘッドになることが多い。 +計算処理の並列化を図ったとしても I/O がボトルネックになってしまい処理全体が高速にならない。 +本項では Cerium に実装した並列処理用 I/O を行ない、I/O 部分の高速化を図った。 + +Cerium の例題ではファイル読み込みを mmap にて実装していた。 +しかし、mmap だとファイルを読み込んでから Task を実行するので、読み込んでいる間は他の CPU が動作せず並列度が落ちる。 -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.2]{images/implementation/CharClassMergePattern.pdf} - \end{center} - \caption{2つの Character Class を merge するときの全パターン} - \label{fig:CharClassMergePattern} -\end{figure} +mmap は function call 後にすぐにファイルを読みに行くのではなく、仮想メモリ領域にファイルの中身を対応させる。 +その後メモリ空間にアクセスされたときに、OS が対応したファイルを読み込む。 +また、読み込む方法が OS 依存となってしまうため環境に左右されやすく、プログラムの書き手が読み込みの制御をすることが難しい。 + +図\ref{fig:mmap}は mmap で読み込んだファイルに対して Task1 、 Task2 がアクセスしてそれぞれの処理を行うときのモデルである。 + +Task1 が実行されると仮想メモリ上に対応したファイルが読み込まれ、読み込み後 Task1 の処理が行われる。 +その後 Task2 も Task1 と同様の処理が行われるが、これら 2 つの Task の間に待ちが入る。 \begin{figure}[htpb] \begin{center} - \includegraphics[scale=0.2]{images/implementation/ccinsert1.pdf} + \includegraphics[scale=0.7]{images/cerium/mmap.pdf} \end{center} - \caption{Character Class を二分木で表示} - \label{fig:ccinsert1} + \caption{mmap Model} + \label{fig:mmap} \end{figure} -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.2]{images/implementation/ccinsert2.pdf} - \end{center} - \caption{ある Character Class の二分木に対して、新しい Character Class を insert} - \label{fig:ccinsert2} -\end{figure} +mmap を使わず、読み込みを独立した Thread で行ない、ファイルを一度に全て読み込むのではなくある程度の大きさ(Block)分読み込み、読み込まれた部分に対して並列に Task を起動する。 +これを Blocked Read と呼び、高速化を図った。 -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.2]{images/implementation/ccinsertresult.pdf} - \end{center} - \caption{insert 後の Character Class の二分木} - \label{fig:ccinsertresult} -\end{figure} +Blocked Read を実装するにあたり、WordCount を例題に挙げる。 +ファイルを読み込む Task (以下、ReadTask) と、読み込んだファイルに対して計算を行う Task (以下、WordCount) を別々に生成する。ReadTask は一度にファイル全体を読み込むのではなく、ある程度の大きさで分割してから読み込みを行う。分割して読み込んだ範囲に対して WordCount を行う。 + +WordCount を Blocked Read で読み込み処理をしたとき以下の図\ref{fig:BlockedRead}の様になる。 \begin{figure}[htpb] \begin{center} - \includegraphics[scale=0.2]{images/implementation/cfab.pdf} + \includegraphics[scale=0.5]{./images/cerium/blockedread.pdf} \end{center} - \caption{cfab} - \label{fig:cfab} + \caption{BlockedRead による WordCount} + \label{fig:BlockedRead} \end{figure} -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.2]{images/implementation/cfdg.pdf} - \end{center} - \caption{cfdg} - \label{fig:cfdg} -\end{figure} +Task を一定の単位でまとめた Task Block ごとに生成して WordCount を行なっている。 +Task Block で計算される領域が Blocked Read で読み込む領域を追い越して実行してしまうと、まだ読み込まれていない領域に対して計算されてしまう。 +その問題を解決するために依存関係を適切に設定する必要がある。 +Blocked Read による読み込みが終わってから TaskBlock が起動されるようにするため、Cerium の API である wait\_for にて依存関係を設定する。 + +また、ReadTask は連続で処理される必要がある。 +なぜならば、ReadTask でファイルを読み込む前提で WordCount がその領域に対して計算を行うので、ReadTask の処理が遅くなってしまうだけでオーバーヘッドとなってしまう。\ref{fig:BlockedReadModel} \begin{figure}[htpb] \begin{center} - \includegraphics[scale=0.2]{images/implementation/cfdgab.pdf} + \includegraphics[scale=0.5]{./images/cerium/blockedreadimage.pdf} \end{center} - \caption{cfdgab} - \label{fig:cfdgab} + \caption{BlockedRead Model} + \label{fig:BlockedReadModel} \end{figure} +\newpage +Blocked Read を実装することにより、読み込み部分と処理部分の並列化を行なった。Blocked Read は連続で読み込まれる必要があるため、さらに I/O 専用 thread を実装した。 + +Cerium Task Manager では、それぞれの Task に対してデバイスを設定することができる。 +SPE\_ANY 設定をすると、Task Manager が CPU の割り振りを自動的に行う。 +Blocked Read は連続で読み込まれなければならないが、SPE\_ANY で設定すると Blocked Read 間に別の Task が割り込まれる恐れがある。(図\ref{fig:spe_any_blockedread}) + \begin{figure}[htpb] \begin{center} - \includegraphics[scale=0.2]{images/implementation/efgi.pdf} + \includegraphics[scale=0.7]{./images/cerium/speblockedread.pdf} \end{center} - \caption{efgi} - \label{fig:efgi} + \caption{BlockedRead と Task を同じ thread で動かした場合} + \label{fig:spe_any_blockedread} \end{figure} +Task が Blocked Read 間に割り込まれないようにするため、I/O 専用 thread である iO\_0 の設定を追加した。 + +IO\_0 は SPE\_ANY とは別 thread の scheduler で動作するので、SPE\_ANY で動作している Task に割り込むことはない。 +しかし、読み込みの終了を通知し、次の read を行う時に他の Task がスレッドレベルで割り込んでしまう事がある。 +pthread\_getschedparam() で IO\_0 の priority の設定を行う必要がある(図:\ref{fig:iothread_blockedread})。 \begin{figure}[htpb] \begin{center} - \includegraphics[scale=0.2]{images/implementation/dfa.pdf} + \includegraphics[scale=0.7]{./images/cerium/iothread.pdf} \end{center} - \caption{dfa} - \label{fig:dfa} + \caption{IO Thread による BlockedRead} + \label{fig:iothread_blockedread} \end{figure} -\begin{figure}[htpb] - \begin{center} - \includegraphics[scale=0.2]{images/implementation/nfa.pdf} - \end{center} - \caption{nfa} - \label{fig:nfa} -\end{figure} - +IO\_0 で実行される Task は Blocked Read のみで、さらに IO\_0 の priority を高く設定することにより Blocked Read が他の Task に割り込まれることなく連続に実行される。
--- a/c4.tex Wed Jan 20 16:16:46 2016 +0900 +++ b/c4.tex Wed Jan 20 17:02:45 2016 +0900 @@ -1,3 +1,89 @@ \chapter{Cerium による文字列処理の例題} \section{WordCount} \section{Boyer Moore Search} +\section{正規表現} +\subsection{正規表現木の生成} +\subsection{正規表現木から NFA の生成} +\subsection{Subset Construction による NFA から DFA の変換} +\subsection{NFA から DFA の生成} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/CharClassMergePattern.pdf} + \end{center} + \caption{2つの Character Class を merge するときの全パターン} + \label{fig:CharClassMergePattern} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/ccinsert1.pdf} + \end{center} + \caption{Character Class を二分木で表示} + \label{fig:ccinsert1} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/ccinsert2.pdf} + \end{center} + \caption{ある Character Class の二分木に対して、新しい Character Class を insert} + \label{fig:ccinsert2} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/ccinsertresult.pdf} + \end{center} + \caption{insert 後の Character Class の二分木} + \label{fig:ccinsertresult} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/cfab.pdf} + \end{center} + \caption{cfab} + \label{fig:cfab} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/cfdg.pdf} + \end{center} + \caption{cfdg} + \label{fig:cfdg} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/cfdgab.pdf} + \end{center} + \caption{cfdgab} + \label{fig:cfdgab} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/efgi.pdf} + \end{center} + \caption{efgi} + \label{fig:efgi} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/dfa.pdf} + \end{center} + \caption{dfa} + \label{fig:dfa} +\end{figure} + +\begin{figure}[htpb] + \begin{center} + \includegraphics[scale=0.2]{images/implementation/nfa.pdf} + \end{center} + \caption{nfa} + \label{fig:nfa} +\end{figure} +
--- a/c5.tex Wed Jan 20 16:16:46 2016 +0900 +++ b/c5.tex Wed Jan 20 17:02:45 2016 +0900 @@ -1,1 +1,5 @@ \chapter{ベンチマーク} +\section{I/O の測定} +\section{Word Count} +\section{Boyer Moore Search} +\section{正規表現}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/CharClassMergePattern.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: CharClassMergePattern.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1422 1908 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/ccinsert1.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: ccinsert1.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1068 1050 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/ccinsert2.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: ccinsert2.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1464 1116 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/ccinsertresult.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: ccinsertresult.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 756 777 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/cfab.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: cfab.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 768 399 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/cfdg.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: cfdg.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 768 300 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/cfdgab.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: cfdgab.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1278 396 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/dfa.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: dfa.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1614 900 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/efgi.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: efgi.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 888 360 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/images/implementation/nfa.bb Wed Jan 20 17:02:45 2016 +0900 @@ -0,0 +1,5 @@ +%%Title: nfa.pdf +%%Creator: extractbb 20150315 +%%BoundingBox: 0 0 1440 615 +%%CreationDate: Tue Jan 12 17:48:31 2016 +
--- a/paper.mm Wed Jan 20 16:16:46 2016 +0900 +++ b/paper.mm Wed Jan 20 17:02:45 2016 +0900 @@ -14,7 +14,6 @@ <node CREATED="1452656320699" ID="ID_1057473092" MODIFIED="1452656360793" TEXT="I/O 専用 Thread"/> </node> <node CREATED="1452338017685" ID="ID_914746422" MODIFIED="1452655605596" POSITION="right" TEXT="文字列処理の例題"> -<node CREATED="1452652958297" ID="ID_1696941789" MODIFIED="1452656312633" TEXT="並列処理時のファイル分割"/> <node CREATED="1452338366831" ID="ID_1893200252" MODIFIED="1452338371045" TEXT="WordCount"/> <node CREATED="1452338371523" ID="ID_869857867" MODIFIED="1452338386316" TEXT="Boyer Moore Search"/> <node CREATED="1452653003540" ID="ID_1626034226" MODIFIED="1452653009934" TEXT="正規表現"> @@ -25,7 +24,8 @@ </node> <node CREATED="1452175345187" ID="ID_741844249" MODIFIED="1452175358409" POSITION="right" TEXT="ベンチマーク"> <node CREATED="1452653771882" ID="ID_1446317191" MODIFIED="1452653789483" TEXT="I/O 測定"/> -<node CREATED="1452653736019" ID="ID_484355456" MODIFIED="1452653745427" TEXT="WordCount"/> +<node CREATED="1453276583223" ID="ID_626494195" MODIFIED="1453276610006" TEXT="mmap option"/> +<node CREATED="1452653736019" ID="ID_484355456" MODIFIED="1453276667202" TEXT="Word Count"/> <node CREATED="1452653745896" ID="ID_1613665884" MODIFIED="1452653756123" TEXT="Boyer Moore Search"/> <node CREATED="1452653756338" ID="ID_50727493" MODIFIED="1452653764810" TEXT="正規表現"/> </node>