第1回 †
概要 †
内容は参考文献参照のこと
- Cell B.E. とは
- MPI と SIMD 演算 + SPE
- N体問題課題説明
- 次回は1/11(木)
課題 †
- N体問題課題説明
- N体パッケージについてはこちらで
- 問題の概要はこんな感じ
- シリアルプログラムを与えるので、MPI化、SIMD+SPE化してください
- 各プロセス(or SPE)が計算する点数を分割すればいいです。
- 加速度計算部分がO(n^2)なので、すごく時間がかかる計算です。なので、並列プログラムで早くします。といっても点数を分割して処理すると O(n^2) / O(1) なので根本的解決にはなりませんけどね
- O(n^2) を何とかする方法については最終回の最適化で考えてもらいたいです
MPI化 †
- 参考文献参照
- 各プロセスにすべての点データを持たせて、forループを適当に分割してやる方針
- 大まかには以下の流れになる
- MPI_Init: 初期化
- 問題の読み込み
- MPI_Comm_rank : ランクの取得
- MPI_Comm_size : 参加しているプロセス数の取得
- 各ランクが受け持つ点の範囲を計算
- 受け持った点の加速度計算、速度計算、位置計算
- MPI 通信関数による速度・位置データの同期
- 5へ戻ってループ
- 規定ステップ実行したら MPI_Finalize および fini_plots_maps とかの終了処理
- 通信関数のヒントとして
- MPI_Send, MPI_Recv, MPI_Bcast, MPI_Gather, MPI_Gatherv, MPI_Allgater, MPI_Allgatherv
あたりを適当に調べて使ってみたらいいんじゃない?
SIMD+SPE化 †
- 参考文献参照
- データを6つのSPEに配分してSIMD(Single Instruction Multiple Data)演算させる
- PPEのSIMDをやらないように注意
- まず、SPE1個で動かすことを考える→6個に拡張
- 大まかには以下の流れになる
- 問題の読み込み
- 各SPEが受け持つ点の範囲を計算
- spe_context_create : SPE に行わせる仕事の情報を作成
- spe_image_open : SPE に行わせるプログラムファイルを開く
- spe_program_load : SPE に行わせるプログラムの読み込み
- spe_context_run : SPE プログラム実行開始
- SPE がデータをメインメモリから読み込む
- SPE がプログラムを実行し、結果をメインメモリへ書き込む
- すべての SPE プログラムが終了後 6に戻ってループ
- 規定ステップ終了後、spe_context_destroy で仕事情報を破棄する、そのた終了処理