comparison paper/cell.tex @ 0:fd9154e03f46

thesis
author e065725@kinjyo.cr.ie.u-ryukyu.ac.jp
date Sat, 13 Feb 2010 21:38:25 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:fd9154e03f46
1 \chapter{CELL BROADBAND ENGINE} \label{chapter:cell}
2
3 \section{Cell Broadband Engineの構造}
4
5 ここでは研究、実験題材の対象となった Cell アーキテクチャについて説明する。
6 Cell Broadband Engine \cite{cell} は、SCEI と IBM によって開発された
7 CPU である。
8 2 thread の PPE (PowerPC Processor Element) と、8個の SPE
9 (Synergistic Processor Element) からなる 非対称なマルチコアプロセッサであり、
10 高速リングバス である EIB (Element Interface Bus) で構成されている。
11 本研究で用いた PS3Linux (Fedora 10, Yellow Dog Linux 6.0) では、
12 6個の SPE を使う事ができる (\figref{cell_arch}) 。
13
14 \begin{figure}[htb]
15 \begin{center}
16 \includegraphics[scale=0.8]{./images/cell_arch.pdf}
17 \end{center}
18 \caption{Cell Broadband Engine Architecture}
19 \label{fig:cell_arch}
20 \end{figure}
21
22
23
24 \section{PPE (PowerPC Processor Element)}
25
26 PPE は Cell Broadband Engine のメインプロセッサで、複数の SPE を
27 コアプロセッサとして使用することができる汎用プロセッサである。
28 メインメモリや外部デバイスへの入出力、SPEを制御する役割を担っている。
29 PPU (PowerPC Processor Unit) は、
30 PPE の演算処理を行うユニットで、PowerPC アーキテクチャをベースとした
31 命令セットを持つ。PPSS (PowerPC Processor Storage Subsystem) は
32 PPU からメインメモリへのデータアクセスを制御する
33 ユニットである (\figref{cell_ppe}) 。
34
35 \begin{figure}[htb]
36 \begin{center}
37 \includegraphics[scale=0.8]{./images/cell_ppe.pdf}
38 \end{center}
39 \caption{PPE (PowerPC Processor Element)}
40 \label{fig:cell_ppe}
41 \end{figure}
42
43 \section{SPE (Synergistic Processor Element)} \label{sec:cell_spe}
44
45 SPE には 256KB の Local Store (LS) と呼ばれる、SPE から唯一、
46 直接参照できるメモリ領域があり、バスに負担をかける事無く
47 並列に計算を進めることが出来る。SPE からメインメモリへは、
48 直接アクセスすることは出来ず、SPE を構成する一つである
49 MFC (Memory Flow Controller) へ、チャネルを介して DMA (Direct Memory Access)
50 命令を送ることで行われる (\figref{cell_spe}) 。
51
52 \begin{figure}[htb]
53 \begin{center}
54 \includegraphics[scale=0.8]{./images/cell_spe.pdf}
55 \end{center}
56 \caption{SPE (Synergistic Processor Element)}
57 \label{fig:cell_spe}
58 \end{figure}
59
60
61 \section{Cell の基本機能}
62
63 \subsection{DMA}
64 \ref{sec:cell_spe}節 で述べた通り、SPE は LS 以外のメモリに
65 直接アクセスすることができず、PPE が利用するメインメモリ上のデータに
66 アクセスするには DMA を用いる。
67 DMA (Direct Memory Access) 転送とは、CPU を介さずに周辺装置と
68 メモリとの間でデータ転送ことで、Cell の場合は
69 メインメモリと LS 間でデータの転送を行う。手順としては以下の様になる。
70
71 \begin{enumerate}
72 \item SPE プログラムが MFC (Memory Flow Controller) に対して
73 DMA 転送命令を発行
74 \item MFC が DMA Controller を介して DMA 転送を開始。
75 この間、SPE プログラムは停止しない。
76 \item DMA 転送の終了を待つ場合、SPE プログラム内で転送の完了を待つ
77 \end{enumerate}
78
79 この時、DMA 転送するデータとアドレスにはいくつか制限がある。
80 転送データが 16 バイト以上の場合、データサイズは 16 バイトの倍数で、
81 転送元と転送先のアドレスが 16 バイト境界に揃えられている必要がある。
82 転送データが 16 バイト未満の場合、データサイズは 1,2,4,8 バイトで、
83 転送サイズに応じた自然なアライメントである (転送サイズのバイト境界に
84 揃えられている) ことが条件となる。
85
86 \subsection{SIMD (Single Instruction Multiple Data)}
87 Cell では、SPE に実装されている 128 ビットレジスタを用いて
88 SIMD を行うことが出来る。SIMD とは、1 つの命令で
89 複数のデータに対して処理を行う演算方式である (\figref{cell_simd}) 。
90
91 \begin{figure}[htb]
92 \begin{center}
93 \includegraphics[scale=0.8]{./images/cell_simd.pdf}
94 \end{center}
95 \caption{SIMD (Single Instruction Multiple Data)}
96 \label{fig:cell_simd}
97 \end{figure}
98
99 \figref{cell_simd} のスカラ演算は以下のような式に当てはまる。
100
101 \begin{verbatim}
102 int a[4] = {1, 2, 3, 4};
103 int b[4] = {5, 6, 7, 8};
104 int c[4];
105
106 for (int i = 0; i < 4; i++) {
107 a[i] + b[i] = c[i];
108 }
109 \end{verbatim}
110
111 これに対し、SIMD 演算は以下のようになる。
112
113 \begin{verbatim}
114 vector signed int va = {1, 2, 3, 4};
115 vector signed int vb = {5, 6, 7, 8};
116 vector signed int vc;
117
118 vc = spu_add(va, vb);
119 \end{verbatim}
120
121 Cell の SIMD 演算では、vector 型の変数を用いる。
122
123 このように、通常は 4 回計算するところを 1 回の計算で行うことが
124 できる反面、すべての演算を 128 ビットで計算するため、なるべく
125 効果的に行う様に工夫する必要がある。
126
127 \begin{verbatim}
128 int a, b, c;
129
130 c = a + b;
131 \end{verbatim}
132
133 この様な計算の場合でも 128 ビット同士の演算を行うため、無駄が生じる。
134
135 \subsection{Mailbox} \label{sec:cell_mailbox}
136
137 Mailbox とは SPE の MFC 内の FIFO キューであり、PPE と SPE 間の 32 ビット
138 メッセージの交換に用いられる。Mailbox では 3 つの振る舞いが
139 出来る様に設計されている (\figref{cell_mailbox}) 。
140
141 \begin{figure}[htb]
142 \begin{center}
143 \includegraphics[scale=0.8]{./images/cell_mailbox.pdf}
144 \end{center}
145 \caption{Mailbox}
146 \label{fig:cell_mailbox}
147 \end{figure}
148
149 \begin{enumerate}
150 \item SPU Inbound Mailbox \\
151 PPE から SPE へデータを渡すためのキュー。キューのエントリ数は
152 実装依存による \cite{cell} が、研究環境では最大4個までのデータを蓄積できる。
153 このキューが空の場合は、SPE は、データがメールボックスに書き込まれるまでは、
154 命令でストールする。読み出すデータの順番は書き込んだ順番に保証されている。
155 \item SPU Outbound Mailbox \\
156 SPE から PPE へのデータを渡すためのキュー。研究環境では最大1個までしか
157 データが蓄積できない。
158 \item SPU Outbound interrupt Mailbox \\
159 SPU Outbound Mailbox とほとんど同じだが、このキューでは SPE から
160 キューにデータが書き込まれると、PPE に対して割り込みイベントが
161 発生し、データの読み出しタイミングを通知する事が出来る。
162 \end{enumerate}
163
164 \section{開発環境}
165
166 \subsection{libSPE2}
167
168 libSPE2 とは、PPE が SPE を扱うためのライブラリ群である \cite{libspe2} 。
169 libSPE2 は SPE Context Creation、SPE Program Image Handling、
170 SPE Run Control、SPE Event Handling、SPE MFC Problem State Facilities、
171 Direct SPE Access for Applications という基本構成でできている。
172 Cell の基本プログラムは次の様になる。
173
174 \begin{enumerate}
175 \item create N SPE context
176 \item Load the appropriate SPE executable object into each SPE context's local store
177 \item Create N threads
178 \item Wait for all N threads to terminate
179 \end{enumerate}
180
181 \subsection{SPU C/C++ 言語拡張}
182 SPE では基本的な C 言語の機能の他に、Cell 特有の拡張が行われている
183 \cite{cell_cpp} 。
184 \tabref{cell_cpp} に主な API を記す。
185
186 \begin{table}[htb]
187 \begin{center}
188 \caption{SPU C/C++ 言語拡張 API}
189 \label{tab:cell_cpp}
190 \begin{tabular}{|l|l|}
191 \hline
192 spu\_mfcdma32 & DMA 転送を開始する \\
193 \hline
194 spu\_read\_in\_mbox & PPE からの mail を取得する \\
195 \hline
196 spu\_write\_out\_mbox & PPE へ mail を送信する \\
197 \hline
198 spu\_add、spu\_sub、spu\_mul & SIMD 演算 (加算、減算、乗算) \\
199 \hline
200 \end{tabular}
201 \end{center}
202 \end{table}
203
204 SPE を効率よく使う上で \tabref{cell_cpp} の様な Cell 特有の API や、
205 SPE アセンブラ命令を学ぶことが必要となる。
206
207 \subsection{SPURS}
208
209 ここでは、現在発表されている Cell の開発環境である SPURS について説明する。
210
211 SPURS \cite{spurs} は、閉じた並列分散と考えることができる Cell の環境で、
212 いかに効率よく動作させるかということを考えたシステムである。
213
214 Cell の性能を存分に生かすためには SPE を効率よく使い切ることであり、
215 SPE の動作を止めることなく、同期を最小限に行う必要がある。
216 そこで SPURS では SPE を効率よく利用するために、PPE に依存せずに SPE コードを
217 選択し、実行することと機能は効率重視で割り切ることを挙げている。
218 そのため、SPE 上にカーネルを組み込んでいる。
219
220 アプリケーションを複数 SPE で実行するとき、アプリケーションプログラムを
221 出来るだけ小さな単位(タスク)に分割し、通信ライブラリを用いて
222 タスク間を依存関係で結合する。
223 LS 常駐のカーネルが、実行可能なタスクを選んで実行していく
224 (\figref{cell_spurs_task}) 。
225
226 \begin{figure}[htb]
227 \begin{center}
228 \includegraphics[scale=0.6]{./images/cell_spurs_task}
229 \end{center}
230 \caption{SPURS Task}
231 \label{fig:cell_spurs_task}
232 \end{figure}
233
234 %また、アプリケーションを分割するとき、プログラムがデータを伴うとき、
235 %ジョブに分割し、並べ替えた上で、カーネルがジョブリストから
236 %ジョブを取得して実行する。
237
238 これらの処理はデータを扱うため、SPURS はパイプラインで実行される
239 (\figref{cell_spurs_pipeline}) 。
240
241 \begin{figure}[htb]
242 \begin{center}
243 \includegraphics[scale=0.6]{./images/cell_spurs_pipeline}
244 \end{center}
245 \caption{SPURS Pipeline}
246 \label{fig:cell_spurs_pipeline}
247 \end{figure}
248
249 以上から、SPURS は複数の SPE を効率よく使うためのライブラリとして
250 優れた物であると思われるが、現在一般には公開されていない。