// 現在(&lastmod;)作成中です。 // 既に書いている内容も&color(#ff0000){大幅に変わる};可能性が高いので、注意。 ------- #contents ------- * 担当教員 [#oa368592] 臼井 英之 * 演習日 [#d56788cd] - 2010.06.03 - 2010.06.10 * 講義内容 [#o4c16be1] - OpenMPを用いた共有メモリ型計算機上での並列処理 - OpenMPの使い方 - Doループの簡単な並列化 - 各スレッドに別々の仕事を担わせる並列化 * 計算機環境 [#d7a9ef31] - scalar マシン、1ノード(1cpu, 2core)を利用 (ノード間ではOpenMPは使えない。ノード内の マルチコア環境での並列化に利用。) - PGI fortran コンパイラー * OpenMPの使い方 [#pd206e3d] -並列化したいところにOpenMPの指示行を入れる。 -!$OMPで始まる指示行(Fortran90 ではコメント行) -例えば、 program hello implicit none integer omp_get_thread_num print*, program start.’ !$OMP parallel print*, My thread number =’, omp_get_thread_num() !$OMP end parallel print*,‘program end.’ end program hello - これをコンパイルするには、 pgf90 -o [output] -mp [filename] ただし、-mpは、OpenMP directive を処理する、という意味。 つけないと、指示行は単なるコメントとみなされ無視される。 -例えば、上の例だと、 pgf90 -o hello -mp hello.f90 とタイプすると、文法的に問題がなければ、helloという実行形式が生成される。 - あとは、並列度数をthread_numとすると setenv OMP_NUM_THREADS [thread_num] とコマンドライン上で環境設定し、実行形式helloのある場所で ./hello とタイプすれば走る。(scalarの場合、thread_numは2を指定する。) - 今回の講義では、バッチジョブで走らせる。 *バッチジョブ [#q377a12c] -scalarのような共有マシンで走らせるには、キューイングシステムを使ってバッチジョブの投入を行うことによりプログラムを走らせる。 -ジョブスクリプトに環境設定とプログラム実行内容を記述。例えば、スクリプト名をtest.shとすると、その内容は以下のような形になる。 #PBS -l cputim_job=00:01:00 #PBS -l memsz_job=1gb #PBS -l cpunum_job=2 #PBS -q PCL-A cd [work_directory] setenv OMP_NUM_THREADS 2 ./hello ただし、[work_directory]は実行形式のあるディレクトリ名 -次に、次のコマンドを用いて、このジョブスクリプトをバッチジョブとしてシステムに投入する。 qsub [ジョブスクリプト名] 上の例だと、test.sh -ジョブスクリプトの処理状況を見るには、 qstat - * &color(#0000ff){【演習】}; [#ic0d822f] program hello を各自作成し、コンパイル後、バッチジョブで実行せよ。 ただし、標準出力は[スクリプト名].o[ジョブ番号] | intent(in) | 入力 | その手続き内で値は変更されない変数 | | intent(out) | 出力 | その手続き内で値が設定される変数 | | intent(inout) | 入出力 | 両者の混合。デフォルト。 | バグの混入を防ぐために、Fortran90/95プログラムでは&color(#ff0000){すべての引数に入出力属性をつける};ことを強く勧める。 ------------------------------ as of &_now; (&counter;)