• 追加された行はこの色です。
  • 削除された行はこの色です。
// 現在(&lastmod;)作成中です。
// 既に書いている内容も&color(#ff0000){大幅に変わる};可能性が高いので、注意。

-------
#contents
-------

* 担当教員 [#oa368592]
臼井 英之
谷口 隆晴

* 演習日 [#d56788cd]
- 2010.06.03
- 2010.06.10
- 2015.05.21
- 2015.05.28

* 講義内容 [#o4c16be1]
- OpenMPを用いた共有メモリ型計算機上での並列処理
- OpenMPの使い方
- Doループの簡単な並列化
- 各スレッドに別々の仕事を担わせる並列化
* 概要と達成目標 [#pc607f98]
OpenMPを用いた,共有メモリ型並列計算機上のプログラミングの基礎を学ぶ.

* 計算機環境 [#d7a9ef31]
- scalar マシン、1ノード(1cpu, 2core)を利用
(ノード間ではOpenMPは使えない。ノード内の
マルチコア環境での並列化に利用。)
- PGI fortran コンパイラー
* 講義資料 [#z2e2e767]
- 準備中
//- 2014/05/29 講義資料 &attachref(lecture20140529.pdf);
//- 2014/06/05 講義資料 &attachref(lecture20140605.pdf);

* 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を指定する。)
- 今回の講義では、バッチジョブで走らせる。
//* Xサーバの有効にしてログインする方法 [#bb240a5e]
//+ すべてのプログラム → Xming → Xming
//+ Tera Term を起動して最初のダイアログで「キャンセル」
//+ Tera Term で「設定」→「SSH転送」→「リモートの(X)アプリケーションをローカルのXサーバに表示する」にチェック
//+ 「ファイル」→「新しい接続」でログイン

*バッチジョブ [#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
-
//* アンケート [#j36d6593]
//今日の講義(6月5日)はどうでしたか?1人1回,&color(red){''必ず''};回答して下さい.

*  &color(#0000ff){【演習】}; [#ic0d822f]
program hello を各自作成し、コンパイル後、バッチジョブで実行せよ。
ただし、標準出力は[スクリプト名].o[ジョブ番号]
//難易度
//#vote(簡単すぎた[0], ちょうどよかった[8], 少し難しかった[2], 難しすぎた[0])

//分量
//#vote(少ない[1], ちょうどよい[8], 少し多い[2], 多すぎる[0])

| intent(in) | 入力 | その手続き内で値は変更されない変数 |
| intent(out) | 出力 | その手続き内で値が設定される変数 |
| intent(inout) | 入出力 | 両者の混合。デフォルト。 |
//今日の講義(5月29日)はどうでしたか?1人1回,&color(red){''必ず''};回答して下さい.

バグの混入を防ぐために、Fortran90/95プログラムでは&color(#ff0000){すべての引数に入出力属性をつける};ことを強く勧める。
//難易度
//#vote(簡単すぎた[0], ちょうどよかった[16], 少し難しかった[2], 難しすぎた[0])

------------------------------
//分量
//#vote(少ない[0], ちょうどよい[16], 少し多い[2], 多すぎる[0])

as of &_now; (&counter;)