担当教員

臼井 英之

演習日

  • 2010.06.03
  • 2010.06.10

講義内容

  • OpenMPを用いた共有メモリ型計算機上での並列処理
  • OpenMPの使い方
  • Doループの簡単な並列化
  • 各スレッドに別々の仕事を担わせる並列化

計算機環境

  • scalar マシン、1ノード(1cpu, 2core)を利用 (ノード間ではOpenMPは使えない。ノード内の マルチコア環境での並列化に利用。)
  • PGI fortran コンパイラー

OpenMPの使い方

  • 並列化したいところに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を指定する。)
  • 今回の講義では、バッチジョブで走らせる。

バッチジョブ

  • 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

【演習】

program hello を各自作成し、コンパイル後、バッチジョブで実行せよ。 ただし、標準出力は[スクリプト名].o[ジョブ番号]

intent(in)入力その手続き内で値は変更されない変数
intent(out)出力その手続き内で値が設定される変数
intent(inout)入出力両者の混合。デフォルト。

バグの混入を防ぐために、Fortran90/95プログラムではすべての引数に入出力属性をつけることを強く勧める。


as of 2019-10-15 (火) 01:09:41 (90)