annotate paper/manycore.tex @ 9:df0056a7b95d

ひとまず完成
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Tue, 10 Feb 2009 14:06:39 +0900 (2009-02-10)
parents 6b06734f1b3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
6b06734f1b3a 5章あと少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 4
diff changeset
1 \chapter{Many Core プログラミング} \label{chapter:manycore}
3
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
2
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
3 Many Core プログラミングは、一つのマシン内で複数のコアを扱う
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
4 プログラミングである。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
5 本章では、Many Core プログラミングの要素や難しさを考察し、
4
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
6 並列プログラムの性能や信頼性を確保するための開発行程を述べる。
3
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
7
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
8 \section{定常的な並列度の必要性}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
9
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
10 並列実行には Amdahl 則 \cite{amdahl} があり、使用する CPU を増やしても、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
11 元のプログラムの並列化率が低ければ、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
12 その性能を生かすことは出来ないとされている。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
13 例えば、プログラムの8割を並列化したとしても、6 CPU で 3 倍程度の
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
14 性能向上しか得られない (\figref{amdahl}) 。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
15
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
16 \begin{figure}[htb]
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
17 \begin{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
18 \includegraphics[scale=0.8]{./images/amdahl.pdf}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
19 \end{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
20 \caption{Amdahl 則}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
21 \label{fig:amdahl}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
22 \end{figure}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
23
4
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
24 このことから、恒常的に並列度を維持する必要がある。
3
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
25 このため、逐次型プログラムの一部を並列化するという手法では不十分である。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
26 LSI などのハードウェアの場合は、演算の対象がもともと多量の演算と
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
27 データパスを持つので、並列計算の効果を定常的に得られることが多い。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
28 しかし、C 等で記述されたプログラムでは、for 文や配列のアクセス等に
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
29 並列性が隠されてしまい、それを引き出すことが難しい。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
30
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
31 \subsection{プログラムとデータの分割}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
32
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
33 プログラムの中の並列度は、主に二つの形で取り出すことができる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
34
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
35 \begin{itemize}
4
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
36 \item データ並列 \\
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
37 配列や木の中の個々の要素に対して並列に実行する (\figref{manycore_data_split})
3
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
38 \item パイプライン処理 \\
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
39 複数の逐次処理の隣通しを重ねて実行する
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
40 \end{itemize}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
41
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
42 \begin{figure}[htb]
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
43 \begin{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
44 \includegraphics[scale=0.7]{./images/manycore_data_split.pdf}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
45 \end{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
46 \caption{データ並列}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
47 \label{fig:manycore_data_split}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
48 \end{figure}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
49
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
50 この二つを同時に用いることで、定常的な並列度を維持することが
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
51 可能となることがある。パイプライン処理は、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
52 主にプログラム中で階層的に使われることが多い。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
53
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
54 データ並列とパイプライン処理を可能にするためには、プログラムとデータの適切な
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
55 分割を行う必要がある。for 文、あるいは木を辿って処理する個々の
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
56 ステートメントがプログラムの分割の対象となる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
57 このとき、データは自明に分割できるわけではなく、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
58 分割できるデータ構造を採用し、必要ならばコピーを行う。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
59
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
60 \subsection{Cell に置けるデータ分割}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
61 分割されたデータは、通常メインメモリ上に置かれるが、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
62 Cell の場合は、SPE の LS 上に置かれることになる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
63 メインメモリ上で計算を行う逐次型プログラムと異なり、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
64 コピーのコストを払ってでもデータを分割し、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
65 複数の CPU で独立に処理する必要がある。特に、DMA 中心のアクセスになる
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
66 Cell の場合は、コピーしやすいように、数 K byte 毎の配列にする方が
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
67 良い。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
68
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
69 さらに、Cell は SPE Program コードも LS 上に置かれるため、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
70 コードをロードする仕組みも必要になる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
71 256KB という SPE の少ないメモリ領域を補うため、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
72 Cell には SPE コードのオーバーレイ機能 \cite{cell_sdk} がある。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
73 オーバーレイとは、メモリ上の実行プログラムの一部を他のコードと
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
74 置き換えながら実行する手法だが、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
75 コードを置き換える時に SPE 自体が止まってしまうので、好ましくない。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
76 そのため、明示的に DMA でコードをロードする必要がある。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
77
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
78 \section{同期}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
79 ここで言う同期とは、複数の CPU がデータの待ち合わせ、または、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
80 整合性を維持するために、他の CPU との待ち合わせを行うことである。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
81
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
82 Many Core では、待ち合わせを行うと並列度が下がってしまうので、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
83 同期自体を減らす必要がある。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
84 そのためには、各 CPU が独立に (ロック無し) でデータにアクセス
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
85 できる様にデータを分割すれば良い。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
86 Cell の場合は SPE の LS 上 にコピーすることになる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
87 しかし、SPE はメインメモリからデータを取得する必要があるので、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
88 取得の際には同期を取る必要がある。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
89 Cell の場合は PPE と SPE 間の同期に関しては、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
90 \ref{sec:cell_mailbox} 節で述べた Mailbox を使用する。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
91 メッセージ交換なので、待ち合わせを避けることが可能である。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
92
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
93 \section{デバッグ}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
94 並列プログラムの特徴として、デバッグが難しいことも挙げられる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
95 実行が非決定的 (同じ状態で実行しても結果が異なる) な場合があり、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
96 バグの状態を再現することが難しい。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
97 また、個々の Core 上のデータを調べる必要があり、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
98 デバッガが複数の Core を取り扱えることが必須である。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
99 Cell の場合、動作している複数 の SPE の一つに対して
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
100 gdb で breakpoint を掛ければ、PPE や他の SPE も同時にストップするが、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
101 それら全ての CPU を手動で管理するのは厳しい。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
102 また、PPE と SPE ではメモリ空間が違うため、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
103 SPE から直接 PPE のデータを見ることができない。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
104
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
105
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
106 \section{並列プログラムの開発行程} \label{sec:manycore_step}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
107 並列プログラミングでは、以下の段階において、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
108 それぞれ実装とテストを行う (\figref{manycore_step}) 。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
109
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
110 \begin{enumerate}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
111 \item C によるシーケンシャルな実装 \label{step1}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
112 \item 並列実行を考慮したデータ構造を持つ実装 \label{step2}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
113 \item コードを分割し、シーケンシャルに実行する実装 \label{step3}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
114 \item 分割したコードを並列実行する実装 \label{step4}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
115 \end{enumerate}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
116
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
117 \begin{figure}[htb]
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
118 \begin{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
119 \includegraphics[scale=0.8]{./images/manycore_step.pdf}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
120 \end{center}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
121 \caption{並列プログラムの開発行程}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
122 \label{fig:manycore_step}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
123 \end{figure}
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
124
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
125 段階 \ref{step1} の実装では、プログラムのアルゴリズムの信頼性を確認するために
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
126 用いる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
127
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
128 段階 \ref{step2} の実装では、コードを分割した際、そのコードが使用できるような
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
129 データ構造への変換が必要になり、段階 \ref{step1} と同じ結果が
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
130 得られるかどうかを検証する。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
131
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
132 段階 \ref{step3} の実装では、並列実行を意識したコードの分割を行う。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
133 この段階まではアーキテクチャに依存しないので、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
134 ターゲットが開発途中の段階でも記述することが可能である。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
135 また、実行が決定的 (入力に対して出力が一意に決まる) であるため、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
136 テストは容易である。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
137 シーケンシャルな実装であるため、デバッグも二分法により容易に行うことが出来る。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
138
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
139 段階 \ref{step4} の実装では、段階 \ref{step3} で分割したコードを
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
140 実際に並列に動かす。段階 \ref{step3} までが動いていれば
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
141 問題なくそのまま動作すると期待される。問題が発生した場合、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
142 その原因と思われる部分を見つけ、一度段階 \ref{step3} に戻した後、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
143 前後のコードと合わせて
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
144 入出力データのチェックなどのテストをしていくことが必要となる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
145 これにより、問題がプログラムのアルゴリズムなのか、
4
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
146 並列実行したことによるデータの整合性の問題(同期、データ送受信のずれなど)か
059572b27b8f add figure, fix
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 3
diff changeset
147 などを判定することができる。
3
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
148
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
149 並列プログラミングでは、以上の段階毎に
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
150 信頼性を確かめながら開発を行っていくことになる。
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
151
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
152 第 \ref{chapter:taskmanager} 章から説明する TaskManager は、
ea6802db8b12 3章と4章もう少し
gongo@gendarme.cr.ie.u-ryukyu.ac.jp
parents: 0
diff changeset
153 以上の開発行程をサポートしたフレームワークとなる。