Mercurial > hg > Papers > 2014 > masakoha-sigos
annotate paper/io.tex @ 3:05a0e70f5823
add some image files
author | Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 17 Apr 2014 01:37:37 +0900 |
parents | b15b449619b1 |
children | c030ccbf279a |
rev | line source |
---|---|
0 | 1 \section{並列処理向け I/O の設計と実装} |
2 | |
2 | 3 \subsection{mmap での実装と問題点} |
4 mmap とは、sys/mman.h に含まれている関数で、ファイルの読み込み等に使用される関数である。 | |
5 ファイルディスクリプタで指定したファイルを offset から len バイトの範囲を読み込む。 | |
6 この時にアドレス addr からメモリを確保するようにする。 | |
7 prot には、PROT\_READによるページの読み込み、PROT\_WRITEによるページへの書き込みなどを指定でき、 | |
8 flags にはメモリ確保する際のオプションを指定することができる。(表\ref{table:mmap}) | |
9 | |
10 \begin{tiny} | |
11 \begin{table}[ht] | |
12 \begin{center} | |
13 \label{table:mmap} | |
14 \small | |
15 void * mmap(void *addr, size\_t len, int prot, int flags, int fd, off\_t offset); | |
16 | |
17 \begin{tabular}[t]{c|l} | |
18 \hline | |
19 void *addr & メモリに確保するときの先頭のアドレス\\ | |
20 \hline | |
21 size\_t len & メモリを確保するサイズ\\ | |
22 \hline | |
23 int prot & ファイルモード選択\\ | |
24 \hline | |
25 int flags & 確保するときのオプション指定\\ | |
26 \hline | |
27 int fd & 読み込むファイルのファイルディスクリプタ\\ | |
28 \hline | |
29 off\_t offset & ファイル先頭からの読み込み開始位置 \\ | |
30 \hline | |
31 \end{tabular} | |
32 \caption{mmap 関数の概要} | |
33 \end{center} | |
34 \end{table} | |
35 \end{tiny} | |
36 | |
37 mmap でファイルを読み込むタイミングは、mmap 関数が呼ばれたときではなく、mmap した領域に対して何らかのアクセスをしたときに初めてファイルが読み込まれる。 | |
38 | |
39 図\ref{fig:mmap}では、読み込んだファイルを分割して、それらの領域に何らかの処理を加えるときの図である。これらの処理を Task と呼ぶ。 | |
40 Task 1 という1個目の Task が実行される。実行されたときに初めてそれらの領域にファイルが読み込まれ、その後何らかの処理が行われ、そして Task 2 も同様に読み込みを行ってから処理が行われる。 | |
41 これら Task は並列に実行されるべきであるが、ファイル読み込みの I/O 部分がネックとなり、本来並列実行される Task が読み込み待ちを起こしてしまう恐れがある。 | |
42 その上、読み込み方法が OS 依存となるために環境によって左右されやすく、プログラムの書き手が読み込みに関して制御しにくい。 | |
43 | |
44 それらを解決するためには、ファイル読み込みと Task を分離し、ファイルの読み込みも制御しやすくでき、なおかつ高速で動くのではないかと考えた。 | |
45 | |
46 | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
47 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
48 \begin{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
49 \includegraphics[scale=0.5]{images/mmap.pdf} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
50 \end{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
51 \caption{mmap image} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
52 \label{fig:mmap} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
53 \end{figure} |
2 | 54 |
0 | 55 |
56 \subsection{Blocked Read の設計と実装} | |
57 | |
2 | 58 Blocked Read とは、読み込みの Task と、それに対する何らかの処理の Task を切り離すための実装方法で、pread 関数にて実装した。 |
59 pread 関数は、unistd.h に含まれているので、UNIX 専用の関数である。ファイルディスクリプタで指定したファイルの先頭 から | |
60 offset 分ずれた場所を基準として、その基準から count バイトを読み込み、それを buf に格納する。 | |
61 \ref{table:pread} | |
62 | |
63 \begin{tiny} | |
64 \begin{table}[ht] | |
65 \begin{center} | |
66 \label{table:pread} | |
67 \small | |
68 ssize\_t pread(int d, void *buf, size\_t nbyte, off\_t offset); | |
69 | |
70 \begin{tabular}[t]{c|l} | |
71 \hline | |
72 int d & 読み込むファイルのファイルディスクリプタ\\ | |
73 \hline | |
74 void *buf & 読み込んだファイルの格納場所 \\ | |
75 \hline | |
76 size\_t nbyte & 読み込むファイル量\\ | |
77 \hline | |
78 off\_t offset & ファイル先頭からの読み込み開始位置\\ | |
79 \hline | |
80 \end{tabular} | |
81 \caption{pread 関数の概要} | |
82 \end{center} | |
83 \end{table} | |
84 \end{tiny} | |
85 | |
86 mmap での実装との違いは、ファイルの読み込みがどのタイミングで起こるかである。 | |
87 mmap で実装したときは、Task 1つ 1つが読み込みを行ってから処理を行う。 | |
88 それに対して、Blocked Readは、読み込み専用の Read Task と、処理専用の Task を別々に生成する。 | |
89 Read Task はファイル全体を一度に読み込むのではなく、ある程度の大きさで分割を行う。 | |
90 分割して読み込み終わったら、それぞれの Task が実行される。 | |
91 (図\ref{fig:block}) | |
92 Read Task が生成されて、その後 Task の生成となるので、Read Task は常に走っている必要がある。 | |
93 | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
94 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
95 \begin{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
96 \includegraphics[scale=0.5]{images/blockedreadimage.pdf} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
97 \end{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
98 \caption{Blocked Read image} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
99 \label{fig:block} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
100 \end{figure} |
2 | 101 |
102 図\ref{fig:block} では、Read Task 1つに対して Task 1つ起動しているが、このように1つ1つ生成、起動をすると Task 生成でメモリを圧迫してしまい、全体的な動作に影響を与えてしまう。 | |
103 実際には Task をある一定数まとめた単位で生成し、起動を行っている。この単位を Task Block と定義する。 | |
104 | |
105 Task Block 1つ当たりの Task 量を $n$ とおく。Task 1つ当たりの読み込む量を $L$ とすると、Task Block 1つ当たりの読み込む量は $L \times n$ となる。 | |
106 Blocked Read が読み込み終わってから、Task Blockが起動するようにするので、Blocked Read 1つ当たりの読み込み量も $L \times n$となる。 | |
107 | |
108 もし、Task Block が Blocked Read よりも先走ってしまうとどうなるであろうか。 | |
109 まだ読み込まれていない領域に対して何らかの処理を行ってしまうので、正しい結果が返ってこなくなってしまう。 | |
110 それを防止するために、Blocked Read が読み込み終わってから Task Block が起動されるように wait をかけている。 | |
111 | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
112 (図\ref{fig:block}) |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
113 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
114 \begin{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
115 \includegraphics[scale=0.5]{images/blockreadtask.pdf} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
116 \end{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
117 \caption{Blocked Read image} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
118 \label{fig:block} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
119 \end{figure} |
2 | 120 |
121 | |
0 | 122 \subsection{I/O 専用 thread の実装} |
123 | |
2 | 124 Cerium Task Manager では、各種 Task にデバイスを設定することができる。 |
125 SPE\_ANY を使用すると、Task Manager で CPU の割り振りを自動的に行う。しかし、この機能を使用すると、Blocked Read に影響を与えてしまう。 | |
126 Blocked Read 、Task それぞれに SPE\_ANY にてデバイスの設定を行うと、Task Manager 側で自動的に CPU を割り当てられ、本来 Blocked Read は連続で読み込むはずが、他の Task を割り当てられてしまう。 | |
127 (図\ref{fig:speany}) | |
128 | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
129 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
130 \begin{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
131 \includegraphics[scale=0.5]{images/speany.pdf} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
132 \end{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
133 \caption{SPE\_ANY での実装時} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
134 \label{fig:speany} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
135 \end{figure} |
2 | 136 |
137 この問題を解決するために、Task Manager に新しく I/O 専用の thread 、 IO\_0 の追加を行った。 | |
138 | |
139 %(図\ref{fig:addio0}) | |
140 %%この問題を解決するために、Task Manager に IO\_0という新しいデバイス設定を追加した。 | |
141 % | |
142 % | |
143 %\begin{figure}[htbp] | |
144 %\begin{center} | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
145 %\includegraphics[scale=0.5]{images/addio_0.pdf} |
2 | 146 %\end{center} |
147 %\caption{IO\_0 の追加} | |
148 %\label{fig:addio0} | |
149 %\end{figure} | |
150 | |
151 SPE\_ANY で使用する CPU の設定よりも高く設定しているので、IO\_0 で設定を行う Read Task に SPE\_ANY で設定した 文字列検索 Task に割り込まれることがなくなる。 | |
152 (図\ref{fig:io0}) | |
153 | |
3
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
154 \begin{figure}[htbp] |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
155 \begin{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
156 \includegraphics[scale=0.5]{images/io0.pdf} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
157 \end{center} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
158 \caption{Blocked Read Task を IO\_0 での実装時} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
159 \label{fig:io0} |
05a0e70f5823
add some image files
Masataka Kohagura <e085726@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
160 \end{figure} |