view paper/cell.tex @ 6:e7c35212c0ae

chapter "cell" add
author admin@mb22-no-macbook.local
date Wed, 18 Mar 2009 00:06:11 +0900
parents 25b7a105f665
children cb4939e15c42
line wrap: on
line source

%\section{Cell}
\label{chap:chapter2}

\pagenumbering{arabic}

\section{Cell}

Cell\cite{cell}は、マルチコアCPUの1つで、構成は「ヘテロジニアス・マルチコアプロセッサ構成」です。
汎用的な用途に対応した1種類のコアを用意するのではなく、制御系プロセッサコア(PPE)と演算系プロセッサコア(SPE)という異なる
コアを用意しています。

\subsection{Cellの構成}

Cellはメインプロセッサである 1基の PowerPC Processor Element (PPE) と8基のデータ処理プロセッサアーキテクチャー Synergistic Processor Element (SPE)
からなる非対称なマルチコアプロセッサであり、高速リングバスで構成されている。\cite{cell}

\begin{figure}[hbp]
  \begin{center}
    % \vskip -\lastskip \vskip -370pt
    \includegraphics[scale=0.3]{image/Cell-main2.pdf}
    \caption{Cell の構成要素}
    \label{fig:cell-main}
  \end{center}
\end{figure}

\subsection{PPE}

PPE は 複数の SPU をコアプロセッサとして使用することができる汎用プロセッサである。
オペレーティングシステムの役割であるメインメモリや外部でバイスへの入出力制御に加えて、
SPEを制御する役割も担っている。
PPU (PowerPC Processor Unit) は、PPEの演算処理をおこなう核となるユニットで、
PowerPCアーキテクチャをベースとした命令セットを持つ。
PPSS (PowerPC Processor Storage Subsystem) は、PPUからメインメモリへの
データアクセスを制御するユニットである。

本研究で用いた PS3Linux では、6個の SPU を制御することができる。

\begin{figure}[hbp]
  \begin{center}
    \vskip -\lastskip \vskip -10pt
    \includegraphics[scale=0.3]{image/PPE.pdf}
    \caption{PowerPC Processor Element (PPE) の構成要素}
    \label{fig:ppe}
  \end{center}
\end{figure}

\subsection{SPE}

SPE は、 PPE のような複雑なプログラム制御よりも、計算を単純に繰り返すマルチメディア系の処理を得意とする
演算系プロセッサである。
SPU (Synergistic Processor Unit) は、SPEの演算処理をおこなう核となるユニットで、
各SPE上に搭載されている。SPUは、PPUとは異なる独自の命令セットを持つ。また、
LS (Local Store) という256KBのメモリを持ち、メインメモリへのアクセスはMFC (Memory Flow Controller) へ
チャンネルを介して DMA (Direct Memory Access) 命令を送ることで行われる。SPU は直接メインメモリへアクセス
することはできない

\begin{figure}[hbp]
  \begin{center}
    \vskip -\lastskip \vskip -10pt
    \includegraphics[scale=0.3]{image/SPE.pdf}
    \caption{Synergistic Processor Element (SPE) の構成要素}
    \label{fig:spe}
  \end{center}
\end{figure}

\section{Cellの基本機能}
\subsection{SIMD (Single Instruction Multiple Data)}

Cell は基本的にあらゆるものを並列的に計算できるような構造になっている。
SPU に実装されている 128 ビットレジスタも SIMD を行う為に設計されている。
SIMD 演算とは 1 つの命令で複数のデータに対して処理をおこなう演算方式である。
以下にスカラ演算と SIMD 演算を図で示す。

\begin{figure}[hbp]
  \begin{center}
    % \vskip -\lastskip \vskip -10pt
    \includegraphics[scale=0.3]{image/SIMD.pdf}
    \caption{スカラ演算とSIMD演算}
    \label{fig:simd}
  \end{center}
\end{figure}

スカラ演算では、4 個の処理結果を得るために 4 回の加算命令を逐次的に実行しなければならない。
一方、SIMD 演算では、1 回の加算命令で 4 個の処理結果を得ることができる。このように SIMD 演算は
スカラ演算に比べて同じ処理を少ない命令で実行することができる。
SIMD 演算が行えるのは複数のデータに対して同じ処理の場合である。
以下のようなデータによって処理が異なる場合には SIMD 演算を行うことができない。

\begin{figure}[hbp]
  \begin{center}
    \includegraphics[scale=0.3]{image/SIMD_no.pdf}
    \caption{SIMD 演算を行えない場合}
    \label{fig:simd_no}
  \end{center}
\end{figure}

\subsection{Mailbox}

Mailbox は、PPE と SPE 間で通信するための機構の一つである。DMA 転送はメインメモリ
と LS との間で最大 16KB の大きなデータの受け渡しを行う。それに対し、Mailbox はステータスの変化などの
小さなデータの受け渡し向けで、PPE と SPE との間で双方向のデータの受け渡しが可能で、FIFO キュー構造になっており、
3 つの振る舞いができるように設計されている。\cite{akira}

\begin{figure}[hbp]
  \begin{center}
    \includegraphics[scale=0.3]{image/Mailbox.pdf}
    \caption{Mailbox}
    \label{fig:mailbox}
  \end{center}
\end{figure}

\begin{enumerate}

\item SPU Inbound Mailbox 

PPE から SPE へデータを渡すためのキューで、最大 4 個までのデータを蓄積できる。もし、
SPE がキューを読むときにキューにデータがない場合は、キューにデータが書き込まれるまで待ち続ける。

\item SPU Outbound Mailbox 

SPE から PPE へデータを渡すためのキューで SPU INbound Mailbox と同様にデータがない場合はデータが
書き込まれるまで待ち続ける。データが 1 個までしかキューに格納できない点が異なる。

\item SPU Outbound Interrupt Mailbox 

SPU Outbound MMailbox とほとんど同じだが、SPE からキューにデータが書き込まれると、
PPE に対して割り込みイベントが発生しデータの読み出しタイミングを通知することができる

\end{enumerate}

\section{開発環境}

\subsection{libSPE2}

libSPE2 とは PPU が SPE を扱うためのライブラリ群である。libSPE2 は SPE Context Creation、
SPE Program Image Handing、SPE Run Control、SPE Event Handing、SPE MFC PRoblem State Facilities、
Direct SPE Access for Applications という基本構成できている。Cell に基本プログラムは次のようになる。

\begin{enumerate}
\item create N SPE context
\item Load the appropriate SPE executable object into each SPE context's local store
\item Create N threads
\item Wait for all N threads to terminate
\end{enumerate}

\subsection{SPU C/C++言語拡張}

SPE は基本的な C 言語の一部の機能しか使えないが、拡張も行われている。
以下にその一部を示す。\cite{gongo}

\begin{table}[htb]
  \begin{center}
    \caption{SPU C/C++ 言語拡張 API}
    \label{tab:cell_cpp}
    \begin{tabular}{|l|l|}
      \hline
      spu\_mfcdma32 & DMA 転送を開始する \\
      \hline
      spu\_read\_in\_mbox & PPE からの mail を取得する \\
      \hline
      spu\_write\_out\_mbox & PPE へ mail を送信する \\
      \hline
      spu\_add、spu\_sub、spu\_mul & SIMD 演算 (加算、減算、乗算) \\
      \hline
    \end{tabular}
  \end{center}
\end{table}

このように Cell 特有の関数やアセンブラ命令を学ぶ事が必要となる。


\subsection{SPURS}

ここでは現在発表されている Cell の開発環境 SPURS について説明する。
SPURS \cite{spurs}とは閉じた並列分散システムと考えることができる。Cell の環境で
いかに効率よく動作させるかということを考えたシステムである。Cell の性能を存分に生かすためには 
SPE を効率よく使い切ることと、あらゆるレベルで並列処理を行うことである。\\

Cell の性能を最大限に生かすためには、SPE を止めることなくデータのアクセスを最小限に
留めて行うことが重要になる。

そこで SPURS では、SPE を効率よく利用するために、PPU に依存せずに SPU コードを選択し、
実行することと機能は効率重視で割り切ることを挙げている。そのために SPE にカーネルを組み込んでいる。

アプリケーションを複数 SPE で実行するとき、アプリケーションプログラムをできるだけ小さな Task に分割し、
通信ライブラリを用いて Task 間を依存関係で結合する。LS 常駐のカーネルは実行可能な Task を選んで実行する。

また、アプリケーションを分割するとき、プログラムがデータを伴うとき、ジョブに分割し、並び替えた上で、
LS 常駐のカーネルはジョブリストからジョブをとってきて実行する。

また、これたはデータを扱うため、SPURS はパイプライン実行を行う。

SPURS は確かにライブラリとして優れた物であると思われるが、公開はされてない。

\begin{figure}[hbp]
  \begin{center}
    \vskip -\lastskip \vskip +30pt
    \includegraphics[scale=0.3]{image/SPURS_task.pdf}
    \caption{Task}
    \label{fig:spurs_task}
  \end{center}
\end{figure}