view manycore.tex @ 7:a927f08d51e2

*** empty log message ***
author gongo
date Mon, 14 Jul 2008 20:51:46 +0900
parents 6458878b4526
children
line wrap: on
line source

\section{Many Core 上のプログムの特徴}
従来の逐次型のプログラムでは、Cell といった Many Core の性能を
十分に引き出すことは出来ない。

\subsection{定常的な並列度の必要性}
並列実行には Amdahl 則 \cite{amdahl} があり、
プログラムの並列化率が低ければ、その性能を生かすことは出来ない。
0.8 程度の並列化では、6 CPU でも
3 倍程度の性能向上しか得られない (\figref{fig-amdahl}) 。

\begin{figure}[tb]
  \begin{center}
    \includegraphics[scale=0.56]{figure/amdahl.pdf}
    \caption{Amdahl 則}
    \label{fig-amdahl}
  \end{center}
\end{figure}

高い並列度ではなくとも、恒常的に並列度を維持する必要がある。
このため、逐次型のプログラムの一部を並列化するという手法では不十分である。
LSI などのハードウェアの場合は、演算の対象がもともと
多量の演算とデータパスを持つので、並列計算の効果を
定常的に得られることが多い。しかし、C 等で記述されたプログラムでは、
for 文や配列のアクセス等に並列性が隠されてしまい、それを引き出すことが難しい。

プログラム中の並列度は、主に二つの形で取り出すことが出来る。

\begin{itemize}
  \item データ並列 : 
    配列や木の中の個々の要素に対して並列に実行する
  \item パイプライン処理 : 
    複数の逐次処理の隣同士を重ねて実行する
\end{itemize}

この二つを同時に用いることで、定常的な並列度を維持することが
可能となることがある。パイプライン処理は、
プログラム中で階層的に使われることが多い。

データ並列とパイプライン処理を可能にするためには、
プログラムとデータの適切な分割を行う必要がある。
for 文、あるいは、木をだとって処理する個々のステートメントがプログラムの
分割の対象となる。

\subsection{デバッグ  }
並列プログラムの特徴として、デバッグが難しいことも挙げられる。
実行が非決定的(同じ状態で実行しても同じ結果が異なる)場合があり、
バグの状態を再現することが難しい。
例えば Cell の場合、複数動いている SPE の一つに対して
gdb で breakpoint を掛けても、他の SPE は動き続けるし、
全ての SPE を手動で管理するのは非常に厳しい。
また、PPE と SPE ではメモリ空間が違うため、SPE から直接 PPE のデータを
見る事ができない。