Mercurial > hg > Papers > 2008 > gongo-ess
view student.tex @ 10:1d3cd0c9eddb
*** empty log message ***
author | gongo |
---|---|
date | Mon, 14 Jul 2008 21:29:17 +0900 |
parents | cb1b97f81a4b |
children | ece94c67e2b9 |
line wrap: on
line source
\section{学生によるTaskManagerを用いた開発} 4月から6月にかけて、学生に TaskManager を用いて 簡単な並列プログラムを書いてもらった。 開発環境は Mac OS X と PS3 Linux である。 ここでは学生の反応について報告する。 \subsection{タスクの概念} 最初は Hello, World のプログラムを書かせた。 通常のCのプログラムと違い、「Hello, World」を表示させる部分を タスクとして記述する、そのタスクを SPE 上で実行するということが 理解しきれない学生がいた。 TaskManager の仕様だけでなく、Cell のような並列実行環境についても 学ぶ必要があった。 \subsection{タスクへのデータ入出力} SPE へ整数の配列を DMA で送り、各要素を2倍にして PPE へ DMA で戻すというプログラムを書かせた。 Cell の DMA にはアライメントの問題があり、 Cell の仕様を理解しきれていない学生が居た。 TaskManager ではその部分を意識させないようにしている (\tabref{tab:tm-api}:\verb|TaskManager::allocate(size);|)。 \subsection{画像の拡大縮小回転、色の変換} 文献\Cite{gongo2} の TaskManager では、 タスクに対して入出力は一つずつしか設定できなかった。 しかし、画像の複数の行を読み込む際、メモリアドレスに間が出来るため、 一つの入力出力では足りないという学生からの意見があった。 そこで新たに、複数の入出力を設定できる \verb|add_inData()、add_outData()| を追加した。これらで設定したデータはリスト構造になっており、 Cell の場合、 MFC List DMA \cite{cell} の機能を使用してDMA を行っている。 また、送ったピクセルデータの長さやその他のパラメータも送りたいという意見から、 32ビットパラメーターを複数送れる \verb|add_param()| というAPIを追加した。 画像の読み込みは SDL \cite{sdl} を使用しており、 最初学生は生成された SDL のデータ構造 (SDL\_Surface) を そのまま SPE に送っていた。 SDL\_Surface にあるピクセルデータはアドレスしか無く、実体はPPE 側にしかない。 しかし、SPE 側で PPE と同じようにそのアドレスを読みに行くということをする 学生が多かった。ここでも SPE の仕様に関して学ぶ必要があった。 その問題を回避するために、アドレスではなくデータを、SDL\_Surface ではなく、 自分たちが作ったタスクに合うようなデータ構造への変換を行った。 \subsection{ソートプログラム} 整数のデータをソートするプログラムである。 データ全てを SPE に送った場合、SPE のメモリ容量では足りない可能性がある。 そこで、データを分割して、それらのブロック毎にSPEに送ってソートする。 次に、隣り合ったブロック同士でソートを行う、 というのを繰り返す (\figref{fig:sortq})。 \begin{figure}[tb] \begin{center} \includegraphics[scale=0.30]{figure/sort_q.pdf} \caption{Sort Program} \label{fig:sortq} \end{center} \end{figure} このソートプログラムの実行速度を、 SPE の個数を変えて出力した (\figref{fig:sort})。 理論値にはおよばないものの、充分な台数効果が出ていると言える。 \begin{figure}[tb] \begin{center} \includegraphics[scale=0.55]{figure/sort.pdf} \caption{Sort 実行結果} \label{fig:sort} \end{center} \end{figure} \subsection{総評} 学生の反応で多かったのは、シーケンシャルプログラムから並列プログラムへ 変換する際に、データやコードの分割を行うのに苦労していたことだ。 分割したデータ構造の設計や使用方法が シーケンシャルなプログラミングとは違うためだと考えられる。 並列処理の経験が浅いプログラマに対しては、コードやデータの分割に際して、 何らかの雛形が必要であると言える。 また、DMA 時のアライメントの問題や、SPE での PPE のアドレスの扱い等、 Cell の仕様に関する問題も起きた。 そういった意見を反映し、環境仕様は Task Manager 側で、意識しないように 実装しているが、タスクの最適化を含め、 プログラマ自身がターゲットアーキテクチャの仕様を学ぶ必要があるだろう。