annotate paper/chapter5.tex @ 34:472f45ab9fca draft default tip

fix
author Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
date Thu, 16 Feb 2012 23:46:16 +0900
parents b69eefd9156e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{デバック}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 並列プログラムの特徴として、デバッグが難しいことが挙げられる。実行が非決定的 (同じ状態で実行しても結果が異なる) な場合があり、バグの状態を再現することが難しい。また、個々の Core 上のデータを調べる必要があり、デバッガが複数の Core を取り扱えることが必須である。Cell の場合、動作している複数 の SPE の一つに対してgdb で breakpoint を掛ければ、PPE や他の SPE も同時にストップするが、それら全ての CPU を手動で管理するのは時間がかかる。また、PPE と SPE ではメモリ空間が違うため、SPE から直接 PPE のデータを見ることができない。
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Cerium での開発工程は、
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \begin{enumerate}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 \item C によるシーケンシャルな実装
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \item 並列実行を考慮したデータ構造を持つ実装
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 \item コードを分割し、シーケンシャルに実行する実装
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \item 分割したコードを並列実行する実装
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 \end{enumerate}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
9
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
12 となっている。逐次的な実行で正常な動作を確認した後、並列に実行した場合に正常な動作をしない場合がある。特にCell特有の問題としてデータ構造が DMA 転送に合っていないこと。つまり、DMA転送される際に、16アライメントに設定されていないか、データのサイズが16の倍数になっていない場合に注意しなければならない。また Cerium ではコードがそれぞれ PPE 用と SPE 用が別個に存在するので、互いのコードが等価であるかもチェックしなければならない。一つのコードに統一しても良いが、別個で対応したい問題がでた時に対応してる。
1
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 バグの例として、本来 SPE で動くべき Task が PPE で動作するなど、Task のスケジューリングでのバグ、Task の設定の際のバグなどがある。
9
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
14
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
15 \section{Texture hash のバグ}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
16
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
17 本研究では、処理性能を著しく低下させる Texture cache のバグに直面した。Texture の cache は、hash で管理され、要求されたデータがキャッシュされてるかを調べるため hash 部分を走査するが、存在していても HIT しないというバグである。hash の走査は稼働率に含まれるため、処理性能は落ちるが、DMA 転送待ち時間や Mail 待ち時間には現れず、高い稼働率を示す。動作はエラーなどは発生せずに正常に行われ、顕著にはバグとして現れない。このバグは分散バージョン管理システム mercurial を用いて、処理性能が極端に低下した部分のバージョンを探し出し特定した。hash のバグの処理性能低下の値を示す。(\tabref{hash})
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
18
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
19 \begin{table}[!htb]
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
20 \begin{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
21 \caption{Texture hash バグの処理性能低下の値} \label{tab:hash}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
22 \hbox to\hsize{\hfil
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
23 \begin{tabular}{|c|l|l|c|} \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
24 & バグあり & バグなし & 性能\\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
25 ball\_boud & 4 FPS & 30.2 FPS & 7.5倍向上 \\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
26 panel & 0.2 FPS & 2.6 FPS & 13倍向上 \\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
27 \end{tabular}\hfil}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
28 \end{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
29 \end{table}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
30
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
31 panel においては 13倍もの性能差が現れた。
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
32
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
33 \section{TaskArrayのバグ}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
34 本研究で実装した TaskArray は、改良前の Cerium の Task スケジューラに変更を加えるかたちで行った。スケジューリングは Scheduelr というクラスの状態遷移で記述している。以下に TaskArray 導入前の Task スケジューリング を示す。(\figref{tm_sm_state})
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
35
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
36 \begin{itemize}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
37 \item SchedMail \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
38 メインスレッドからのメッセージ (Mailbox) を取得する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
39 \item SchedTaskList \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
40 TaskList を取得する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
41 \item SchedTask \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
42 TaskList から取得した Task を実行する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
43 \item SchedExit \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
44 SPE の実行を終了する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
45 \item SchedNop \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
46 何も行わない
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
47 \end{itemize}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
48
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
49 \begin{figure}[htb]
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
50 \begin{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
51 \includegraphics[scale=0.7]{images/tm_sm_state.pdf}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
52 \caption{Scheduler クラスの状態遷移}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
53 \label{fig:tm_sm_state}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
54 \end{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
55 \end{figure}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
56
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
57 TaskArray 導入には、この Scheduler の状態遷移図を変更した。TaskArray 導入後の状態遷移を示す。(\figref{stb-state})
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
58
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
59 \begin{itemize}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
60 \item SchedMail \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
61 メインスレッドからメッセージ(Mailbox)を取得する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
62 \item SchedTaskList \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
63 TaskList を取得する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
64 \item SchedTask, SchedTaskArrayLoad\\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
65 受け取った TaskList の中の Task が 単一 Task か、Task Array なのかを判別する \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
66 Task Array の時は Task Array をメインメモリから転送する(SchedTaskArrayLoad)
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
67 \item SchedTaskArray, SchedTaskArrayLoad\\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
68 TaskList から取得した Task Array を実行する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69 \item SchedExit \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
70 SPE の実行を終了する
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
71 \item SchedNop, SchedTaskArrayNop, SchedNop2Ready \\
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
72 何も行わない。パイプラインステージの待ち合わせ用
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
73 \end{itemize}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
74
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
75 \begin{figure}[htb]
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76 \begin{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 \includegraphics[scale=0.7]{./images/stb-state.pdf}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
78 \end{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
79 \caption{Schedulere クラスの状態遷移(TaskArray)}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
80 \label{fig:stb-state}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
81 \end{figure}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
82
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
83 TaskArray 実装後には 動作中にエラーが起き、処理が正常終了しないバグが発生した。これは TaskArray のスケジューリングにおいて、パイプラインの待ち合わせができていないために起こった。デバッグには、状態遷移を洗い出し、足りないパイプラインステージを明らかにし追加した。それが SchedTaskArrayNop である。これによって TaskArray のスケジューリングが正常に動作した。
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
84
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
85 \section{メモリアクセスの局所性}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
86 本研究の際に例題として実装した WordCount では著しく処理性能が低下する減少が起こった。WordCount 対象のファイルに対して、ランダムアクセスに近いアクセス方法を取ったのが原因である。離れたメモリへのアクセスを繰り返すと頻繁なスワップが起き、処理性能の低下につながる。Task への input data の割り振りをインクリメント的にファイルへアクセスするように変更することで、この問題を解決した。その値を測定した。(\tabref{memory-access}) wc 対象のファイルサイズは約100MBである。
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
88 \begin{table}[!htb]
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
89 \begin{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
90 \caption{メモリアクセスの局所性を保った改良} \label{tab:memory-access}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91 \hbox to\hsize{\hfil
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 \begin{tabular}{|c|l|l|c|} \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
93 & 改良前 & 改良後 & 性能\\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94 実行時間 & 30s & 2.2s & 15倍向上 \\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95 dma wait & 14\% & 8\% & 1.7倍向上 \\ \hline
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
96 \end{tabular}\hfil}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
97 \end{center}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
98 \end{table}
Yutaka_Kinjyo <yutaka@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
99