Contents

Previous Topic

5. PBSによるジョブの投入

Next Topic

7. ISVアプリケーション(一部利用ユーザ制限あり)

6. プログラミングと環境

TSUBAME2.5で使用できるコンパイラは,gcc,pgi,intelの3種類がインストールされています. 各コンパイラともに利用可能です.

※ CUDA(nvcc)については 6.5 GPU を参照ください.

6.1 コンパイラ

基本になる3種類のコンパイラについては,パスが通してありますので特別な処理なして利用可能です.

6.1.1 利用できるコンパイラ

各コンパイラの使用例を以下に示します.

1.pgi

> pgf95 -V
pgf95 17.1-0 64-bit target on x86-64 Linux -tp nehalem
The Portland Group - PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.
(pgf90も同じく表示されます)

> pgcc -V
pgcc 17.1-0 64-bit target on x86-64 Linux -tp nehalem
The Portland Group - PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.

2.gnu

> gfortran --version
GNU Fortran (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.
 :
> gcc  --version
gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc
 :

3.intel

> ifort -V
Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64,
Version 14.0.2.144 Build 20140120
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

> icc -V
Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64,
Version 14.0.2.144 Build 20140120
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

4.コンパイル例

fortranプログラムとcで記述された時計ルーチンをコンパイルします.

gnu
gfortran -o sample -Wall sample.f wclock.c

pgi
pgf95 -fastsse -o sample -Minfo=all sample.f wclock.c

intel
icc -c wclock.c
ifort -fast -o sample -report sample.f wclock.o
【注意】
コンパイル時に “-o” オプションにより 実行プログラムに任意の名を付加する ことができます. 無指定時は「a.out」となりますが,任意の名前を付けるようにしてください.

6.1.2 数学ライブラリ

TSUBAME2.5では,ベンダー提供のコンパイラに付属する数学ライブラリもインストールされています.

1.PGI

最新版の16.xからACMLの提供は廃止されています。オープンソースまたは、旧版をご利用ください. 旧版の場合,ライブラリにパスが通っていますので,リンクオプションの指定により利用できます.

source /usr/apps.sp3/isv/pgi/pgiset15.10.sh
pgf95 -o sample -fastsse sample10.f wclock.c -lacml

この場合のライブラリの格納場所は /usr/apps.sp3/isv/pgi/15.10/linux86-64/2015/lib になっています.

2.INTEL

math_kernel_libraryがインストールされています.

ifort -o sample -mkl=sequential sample10.f wclock.o -lmkl_lapack95_lp64 \
-L/usr/apps.sp3/isv/intel/xe2013.1.046/composer_xe_2013_sp1.2.144/mkl/lib/intel64

ライブラリの格納場所は /usr/apps.sp3/isv/intel/xe2013.1.046/composer_xe_2013_sp1.2.144/mkl/lib/intel64 になっています.

6.1.3 コンパイラのオプション

各コンパイラ共に多くのオプションが用意されています.使用される機会の多いオプションを表にしました.

コンパイラ名称 gnu pgi intel
FORTRAN gfortran pgf95 ifort
c/c++ gcc/g++ pgcc/pgc++ icc/icpc
MPI利用 ◎(※1)
OpenMP -fopenmp -mp -openmp
自動並列 × -Mconcur -parallel
高速化オプション -fastsse -fast
リスト出力 -Wall -Minfo=all -report
ドキュメント(※2) man コマンド pgi/16.1/linux86-64/2016/doc intel/xe2013.1.046/composer_xe _2013_sp1.2.144/Documentation/

※1.mpif90利用の場合は,バージョンに注意が必要,※2./usr/apps.sp3/isv内

※pgiのc++コンパイラ pgi15.10までは pgCC だったコマンドが 16.1から pgc++ になっています

6.1.4 コンパイラ利用に当たっての注意

利用にあたっては,以下の点についてご注意ください.

1.32bitコード

TSUBAMEでの動作は,基本的には64bitで実行されますが,ユーザー様所有のライブラリが 32bit版しかない場合,コンパイルオプションの「-tp」を使用して実行モジュールを作成ください.

pgf95 -tp k8-32 sample.f90 -L/home/login_name/lib -labc
2.最適化

最近のバージョンでは,最適化が強化されております.プログラムを高速処理するために,一部に書き換えを実施する 場合があります.特に -fast/-fastsse をご利用のユーザー様には,事前に動作を確認いただきますようお願いいたします.

※ 結果が変化したという報告はいただいておりませんが,念のためにお願いいたします.

3.コンパイラのMPIオプションについて
pgi,intelコンパイラでは,独自にサポートしているmpiオプションがありますが,TSUBAME2.5ではサポート対象外です.

6.1.5 違うバージョンのコンパイラ

TSUBAME2.5では,バージョンの異なるコンパイラも用意しています. 次の手順でコンパイラのパスを切り替えてご利用ください.

PGI Compiler の場合.

> source /usr/apps.sp3/isv/pgi/pgiset17.5.sh  (17.5部分でバージョンを指定)
> pgf95 -V
pgf95 17.5-0 64-bit target on x86-64 Linux -tp nehalem

Intel Compiler の場合.

> source /usr/apps.sp3/isv/intel/2015.0.090/bin/compilervars.sh intel64
> source /usr/apps.sp3/isv/intel/2015.0.090/bin/ifortvars.sh intel64
> ifort -V
Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 15.0.0.090 Build 20140723

> source /usr/apps.sp3/isv/intel/set_intel-psxece-2017update1.sh
> ifort -V
Intel(R) Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 17.0.1.132 Build 20161005
Copyright (C) 1985-2016 Intel Corporation.  All rights reserved.
【重要】
  • MPIライブラリの利用において,不整合が発生する場合があります. 必ず動作確認を実施してください.詳細については 6.3 MPI並列 を参照ください.
  • 2016年12月現在で,PGI(Ver.13.3,14.6,14.7,14.9,14.10,15.1,15.3,15.4,15.5,15.7,15.9,15.10,16.1,16.3, 16.4,16.5,16.7,16.9,16.10,17.1,17.3,17.4,17.5), Intel(Ver.xe2013.1.046 , 2015.0.090,16.0.2.181 , 17.0.1.132)です.
  • CUDAについては 6.5 GPU を参照ください.
  • PGIを元に戻す場合は 17.1 を指定してください
  • Intel 2016使用の際は、MPI等のバスを確認してください. こちらも参照 してください.

6.1.6 コンパイラのマニュアル

PGI,INTELコンパイラおよびCUDAにはマニュアルが用意されています.

1.PGIコンパイラ

次の操作によりTSUBAME上で参照することができます.

evince /usr/apps.sp3/isv/pgi/17.1/linux86-64/2017/doc/pgi17ug.pdf
man pgf95 (pgcc)

2.INTELコンパイラ

次の操作によりTSUBAME上で参照することができます.

firefox /usr/apps.sp3/isv/intel/xe2013.1.046/composer_xe_2013_sp1.2.144/\
Documentation/en_US/get_started_lf.htm
man ifort (icc)
※日本語で読みたい場合は以下をご利用ください
firefox /usr/apps.sp3/isv/intel/xe2013.1.046/composer_xe_2013_sp1.2.144/\
Documentation/ja_JP/get_started_lc.htm

3.CUDA

次の操作によりTSUBAME上で参照することができます.

firefox /usr/apps.sp3/cuda/7.5/doc/html/index.html
cd /usr/apps.sp3/cuda/cuda/7.5/doc/
evince  (沢山のドキュメントがありますので該当を選択)
man nvcc

6.2 SMP並列

1.openMPを使用した並列コンパイル

openMPによる並列処理が可能なfortranプログラムとcで記述された時計ルーチンをコンパイルします.

gnu
gfortran -O3 -o sampleOMP -fopenmp -Wall sampleOMP.f wclock.c

pgi
pgf95 -fastsse -o sampleOMP -mp -Minfo=all sampleOMP.f wclock.c

intel
icc -c wclock.c
ifort -fast -o sampleOMP -openmp -openmp-report2 sampleOMP.f wclock.o
2.自動並列コンパイル

この機能は,コンパイラがプログラムを解析して自動的に並列化するものです.

gnu
自動並列はありません.

pgi
pgf95 -fastsse -o sampleAUTO -Mconcur -Minfo=all sampleAUTO.f wclock.c

intel
icc -c wclock.c
ifort -fast -o sampleAUTO -parallel -par-report2 sampleAUTO.f wclock.o
注).コンパイルオプションはコンパイラによって異なります.
ここで付加しているオプションは機能的に同様なものを指定しています.

6.3 MPI並列

MPI環境は,コンパイラとMPIドライバの組み合わせで幾種類かを選択して利用することが可能です. 以下に利用方法を示します. (コンパイラのバージョンに注意)

1.MPI標準環境(openMPI + intel)

> mpif90 -V
Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.2.144 Build 20140120
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

2.openMPI + pgi環境

> export PATH=/usr/apps.sp3/mpi/openmpi/1.6.5/p17.1/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/openmpi/1.6.5/p17.1/lib:$LD_LIBRARY_PATH
> mpif90 -V
pgf95 17.1-0 64-bit target on x86-64 Linux -tp nehalem
The Portland Group - PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.

※バージョンを切り替えるときは次のシェルをお使いください.

source set_ompi-1.6.5_p17.1.sh             (pgi17.1)
source set_ompi-1.8.2_p17.1_cuda7.5.sh     (pgi17.1+cuda7.5)

3.openMPI + gnu(gfortran)環境

> export PATH=/usr/apps.sp3/mpi/openmpi/1.6.5/g4.3.4/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/openmpi/1.6.5/g4.3.4/lib:$LD_LIBRARY_PATH

> mpif90 --version
GNU Fortran (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.

4.mvapich2 + intel環境

> export PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/i2013.1.046_cuda7.5/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/i2013.1.046_cuda7.5/lib:$LD_LIBRARY_PATH
> mpif90 -V
Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 13.0.0.079 Build 20120731
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.

※ 表示に

main.c:(.text+0x38): undefined reference to `MAIN__'
あるいは
f90main.c:(.text+0x3a): undefined reference to `MAIN_'

などと出る場合がありますが,mpiのバージョン表示時のオプション配置の問題ですので,動作には影響ありません. (mpich2でも同様に表示される場合があります)

5.mvapich2 + pgi環境

> export PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/p17.1_cuda7.5/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/p17.1_cuda7.5/lib:$LD_LIBRARY_PATH
> mpif90 -V
pgf95 17.1-0 64-bit target on x86-64 Linux -tp nehalem
The Portland Group - PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.

6.mvapich2 + gnu環境

> export PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/g4.3.4_cuda7.5/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mvapich2/2.0rc1/g4.3.4_cuda7.5/lib:$LD_LIBRARY_PATH
> mpif90  -version
GNU Fortran (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.

7.mpich2 + intel環境

> export PATH=/usr/apps.sp3/mpi/mpich2/3.1/i2013.1.046/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mpich2/3.1/i2013.1.046/lib:$LD_LIBRARY_PATH
> mpif90 -V
Intel(R) Fortran Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 13.0.0.079 Build 20120731
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.

※ mpich2-1.5 以後メモリの使用方法に変更がありPBSの使用メモリ量を過小評価する場合があります。

8.mpich2 + pgi環境

> export PATH=/usr/apps.sp3/mpi/mpich2/3.1/p17.1/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mpich2/3.1/p17.1/lib:$LD_LIBRARY_PATH
> mpif90 -V
pgf95 17.1-0 64-bit target on x86-64 Linux -tp nehalem
The Portland Group - PGI Compilers and Tools
Copyright (c) 2017, NVIDIA CORPORATION.  All rights reserved.

9.mpich2 + gnu環境

> export PATH=/usr/apps.sp3/mpi/mpich2/3.1/g4.3.4/bin:$PATH
> export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/mpich2/3.1/g4.3.4/lib:$LD_LIBRARY_PATH
> mpif90  -version
GNU Fortran (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.

6.4 ハイブリッド並列

ここで言うハイブリッド並列とは,ノード間並列をMPIで,ノード内はSMPを使用した並列のことを表します. 次の手順でプログラムを作成,実行します.

1.コンパイル

icc -c wclock.c
mpif90 -O3 -o hybrid -openmp -openmp-report2 hybrid.f wclock.o

2.動作確認

export OMP_NUM_THREADS=1
mpirun -np 1 ./hybrid
mpirun -np 2 ./hybrid
export OMP_NUM_THREADS=2
mpirun -np 2 ./hybrid

3.バッチへの投入

t2sub -l select=4:mpiprocs=1:ncpus=8:mem=3gb -l place=scatter sample.sh

この投入例の場合,ノード内8並列で,4ノードを使用した32並列になります.

※ シェルの作成,投入については 5.3.8 ハイブリット並列 も参照ください.

6.5 GPU

全てのインタラクティブノードでGPUをご利用いただけます.

ssh -Y login-t2.g.gsic.titech.ac.jp -l login_name

インタラクティブノードマシン t2a006161 - t2a006180 であることを確認してください.

ただし,インタラクティブノードはコンパイル,デバッグ,バッチへの投入などの作業用としてお使いください. バッチキューの利用にあたりましては, 5. PBSによるジョブの投入 を参照ください.

6.5.1 CUDA

CUDAコンパイラ,ドライバを初めとしたCUDAツールキットが利用可能となっています. ソースファイル名がsample1.cuの場合,以下のコマンドを実行すると実行形式a.outが生成されます.

$ nvcc sample1.cu

ソースファイル名の拡張子は「 .CU 」としてください.実行形式ファイル名を指定する場合は-oオプションで指定します.

cudaは活発に開発が行なわれているため,バージョンの更新も比較的短いサイクルで行われます. nvccのバージョンを調べる場合は次のようにしてください.

> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
>

デフォルトと異なるバージョンのcudaを使用したい場合は,次の手順で切り替えてください.

> cd /usr/apps.sp3/cuda
> ls
5.0  5.5  6.0  6.5  7.0  7.5
> cd 7.0
> source ./cuda.sh

これによりバージョンを切り替えることができます.

以下の例では実行ファイルsample1が生成されます.その他のオプションについては,-hオプションで参照可能です. ドキュメントを参照したい場合は 6.1.6 コンパイラのマニュアル を参照ください.

$ nvcc -o sample1 sample1.cu

実行モジュールが作成てきたら,動作させてみます.

$ ./a.out

動作するようでしたら,ジョブスクリプトを作成して,バッチキュー(G)に投入します.

$ t2sub -q G  -l select=1 -W group_list=xxx ./job.sh

6.5.2 CULAライブラリ

線形代数ライブラリ「LAPACK」をCUDA対応GPUに最適化、実装した「CULA」をご利用いただけます. 同梱のサンプルをコンパイルしてみます.以下の手順でお試しください.

$ cp -r /usr/apps.sp3/isv/CULA/R18/examples .
$ cd examples/basicUsage

$ vi Makefile (cudaのリンクを付加)

LIBS=-lcula_lapack -lcublas -L/usr/apps.sp3/cuda/6.0/lib64 -liomp5
:wq

$ make build64
$ cd ../fortranInterface
$ vi Makefile (cudaのリンクを付加)

LIBS=-lcula_lapack -lcublas -L/usr/apps.sp3/cuda/6.0/lib64 -liomp5
:wq

$ export LD_LIBRARY_PATH=/usr/apps.sp3/isv/CULA/R18/lib64:$LD_LIBRARY_PATH
$ ./fortranInterface
Initializing CULA
Calling CULA_SGEQRF
Shutting down CULA
$

ドキュメントは /usr/apps.sp3/isv/CULA/R18/doc から参照することができます. CUDA 5.0 対応版(SP1)をご利用の場合は,/usr/apps/isv/CULA/R16a/をご利用ください. ライブラリとCUDAのバージョンの整 合は 6.5.4 コンパイラ・ライブラリのバージョン を参照ください.

6.5.3 PGIコンパイラ

PGIコンパイラでは,指示行によりGPUに対応した実行モジュールを生成することができます.

1.指示行

対象となる計算部分(配列計算部分)を挟んで,以下のような指示行を挿入します.

!$acc region
 DO k=1,100
  DO J = 1,600
   DO I = 1,5000
     c(j,i) = c(j,i) + A(I,J) * B(J,I)
   ENDDO
  ENDDO
 ENDDO
!$acc end region
2.コンパイル

コンパイルオプションにCUDA用のオプション「-ta=nvidia」を付加します.同時に,使用するcuda Toolkitの バージョンも指定(,cudax.x)するようにしてください.バージョンの対応については 6.5.4 コンパイラ・ライブラリのバージョン を参照してください. また,cuda用のコンパイルをしたことを確認するために-Minfo=all でコンパイルメッセージを確認してください.

> source /usr/apps.sp3/isv/pgi/pgiset17.1.sh
> pgf95 -Minfo=all -fastsse -o tesla  -ta=nvidia,cuda7.5 cuda.f wclock.c
 :
  17, Generating present_or_copy(c(:,:))
      Generating present_or_copyin(a(:,:))
      Generating present_or_copyin(b(:,:))
      Generating NVIDIA code
      Generating compute capability 1.3 binary
 :
3.実行

実行モジュールができたら,インタラクティブで実行を確認します.

./tesla

動作するようでしたら,ジョブスクリプトを作成して,バッチキュー(G)に投入します.

t2sub -q G  -l select=1 -W group_list=xxx ./job.sh

6.5.4 コンパイラ・ライブラリのバージョン

cuda対応のコンパイラ,ライブラリの相互関係は以下の状況です.

cuda          CULA      pgi
-----------+---------+---------
5.0           R16      13.2-  (SP1)
5.5                    14.2-  (SP1)
6.0           R18      14.6-  (SP3)
6.5                    15.1-  (SP3)
7.0                    15.4-
7.5                    16.1-
7.5                    17.1-

対応バージョンの異なるルーチンをリンクした場合に実行エラーの可能性がありますので,ご注意ください.

6.5.5 MPI+cudaによるコンパイル

TSUBAMEのMPI環境は,コンパイラとMPIドライバの組み合わせで幾種類かを選択して利用することが可能です. 詳細は 6.3 MPI並列 を参照ください. 最新のmpiはMPIの実装時にcuda7.5を使用してます。詳細は 3.4.5 cuda7対応のmpi環境 を参照ください. また,MVAPICH2でGPUDirect v1機能を使う場合は環境変数MV2_USE_CUDA=1を設定する必要があります。 こちら も参照ください.

基本的な利用としては,各環境時のcコンパイラをnvccに置き換えます. ここでは,例としてopenmpi+gcc環境をベースにして実施する例を示します. 始めにMPI環境を指定します.

export PATH=/usr/apps.sp3/mpi/openmpi/1.8.2/g4.3.4_cuda7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/apps.sp3/mpi/openmpi/1.8.2/g4.3.4_cuda7.5/lib:$LD_LIBRARY_PATH

続いて,コンパイルしますが nvcc を使用する際に明示的に mpi.h にパスを通すようにして,

nvcc  -c  xx.cu -I/usr/apps.sp3/mpi/openmpi/1.8.2/g4.3.4_cuda7.5/include

などと指定します.これにより *.o が生成されますのでこれらをリンクします.

mpicc -o gpumpi xx.o gpufunc.o -L/usr/apps.sp3/cuda/7.5/lib64 -lcudart

となります.リンク時は,cudaのライブラリを明示的に指定してください. 最初に *.oを作成し,後にリンクという手順となります.

6.6 性能解析ツール

TSUBAME2.5では各種のツールを用意しております.

6.6.1 プロファイラ(シングル)

PGIのプロファイラを使ってみましょう.デフォルトの17.1に問題があるため、少し前の版を使用します. 最初に,コスト分析する実行モジュールを作成します.

source /usr/apps.sp3/isv/pgi/pgiset15.10.sh
pgf95 -Mprof=func -o sample10 sample10.f wclock.c

ここでは,-Mprof=func のオプションを付加します. sample10という名前の実行モジュールが出来ているはずですから,

./sample10

として実行します.終了すると pgprof.out というファイルが作成されています. このファイルを確認できたら

pgprof -nocheckjvm -jarg,-Xmx4G

これにより,以下のような画面が表示されます.

_images/prof01.png
【注意】
起動できない場合は, 5.9 SSH直接ログイン のようにマシンを確保して実行ください. 表示が遅い場合、ssh 接続時に”-C”オプションを付加すると改善する場合があります。

6.6.2 プロファイラ(並列)

MPI並列プログラムもプロファイラを使用できます.(シングル同様少し古い版)

以下の手順で実施してください.

> source /usr/apps.sp3/isv/pgi/pgiset15.10.sh
> pgf95 -o s22 -Mmpi=mpich -Mprof=mpich,func sample11b.f wclock.c
> which pgf95
/usr/apps.sp3/isv/pgi/15.10/linux86-64/2015/bin/pgf95
      (コンパイラの格納場所を確認します)
> /usr/apps.sp3/isv/pgi/15.10/linux86-64/2015/mpi/mpich/bin/mpirun -np 4 ./s22
> ls
pgprof.out   pgprof1.out    pgprof2.out    pgprof3.out
> pgprof -nocheckjvm -jarg,-Xmx4G -exe ./s22

これにより,以下のような起動画面が表示されます.

【重要】
このプロファイラを使用する場合は,ノード内並列でご利用ください. PGI専用のMPIを使用しますのでノード間通信はできません. ノート間でのプロファイラが必要な場合は チューニング講習会 p.123を参照してください.
_images/prof02.png

例のように”OK”の後,プロファイラのウインドウのFileメニューから「New Profilong Session」を選択します. 以下の①部分のようなファイル名指定ウインドウが表示されてきますので,順に情報をいれるとプロファイラ画面が 表示されてきます.

_images/prof03.png

6.6.3 デバッカ(シングル)

TSUBAME2.5に用意されているTotalViewを使ってみましょう. 最初に,デバックする実行モジュールを作成します.

gfortran -g -o sampleOMP sampleOMP.f wclock.c

ここでは,-gのオプションを付加します. sampleOMPという名前の実行モジュールが出来ているはずですから,

totalview sampleOMP

これにより,以下のような起動画面が表示されます.(プログラムを指定していないと選択画面が出ます)

_images/view01.png

ここでOKを選択すれば,いよいよ作業画面になります.それでは,デバック開始です.

_images/view02.png

利用詳細については,利用の手引を参照ください.

6.6.4 デバッカ(並列)

totalviewはMPI並列プログラムも扱うことができます. デバックする実行モジュールを作成します.

mpif90 -g sample11a.f wclock.c

ここでは,-gのオプションを付加します. a.outという名前の実行モジュールが出来ているはずですから,

totalview a.out

これにより,以下のような起動画面が表示されますので,mpi環境と並列数を入力します.

_images/viewpara01.png

シングルの時と同じような画面が表示されてきますので,プログラムを調査したい部分のライン番号をクリック してマーキングします.赤くSTOPと表示されたらメニューから「Go」を選択して実行します.

_images/viewpara02.png

暫らくまっていると指定のポイントで停止しますので,このときの変数の値を右上のウインドウからチェックします. この操作を順次繰り返してデバックを進めてください.

6.6.5 デバッカ(GPU)

totalviewはGPUプログラムも扱うことができます.

デバックする実行モジュールを作成します.

gfortan  -g samplegpu.f

ここでは,-gのオプションを付加します. a.outという名前の実行モジュールが出来ているはずですから,

totalview ./a.out

これにより,以下のような起動画面が表示されますので,CUDA環境を選択します.

_images/totalcula.png

以後の利用方法は 6.6.3と同じです.

6.6.6 パフォーマンスアナライザー

TSUBAME2.5にはパフォーマンスアナライザーとして,VTune Amplifier XEがインストールされています.

デバックする実行モジュールを作成します.:

gfortran -g sample.f

次に VTune を起動します.

$ source /usr/apps.sp3/isv/intel/vtune/vtune_amplifier_xe_2015/amplxe-vars.sh
Copyright (C) 2009-2014 Intel Corporation. All rights reserved.
Intel(R) VTune(TM) Amplifier XE 2015 (build 380310)

$ amplxe-gui

これにより,以下のような起動画面が表示されます. New Projectボタンを押すと,Create a Projectウインドウが立ち上がります.

_images/vtune001.png

Project name欄を入力してCreate Projectボタンをクリックします.

_images/vtune001-2.png

Application欄に作成したa.outを入力し,OKボタンをクリックします.

_images/vtune002.png

次にNew Analysisボタンをクリックします.

_images/vtune003.png

すると次の画面が立ち上がります.

_images/vtune004.png

Analysis Type から分析したい内容を選択し,右側の Start ボタンをクリックすると分析が始まります.

Note

  • Memory Access など一部機能は,インタラクティブノード上でのみ利用可能です.
_images/vtune005.png

6.6.7 PAPIによる性能評価

プログラムの準備は,サンプルプログラムを参照してください.(/work0/soudan/tune/papi_t.c)

1.プログラムをコンパイルします.

source /usr/apps.sp3/free/papi/4.2.1/papi.sh
gcc papi_t.c -I/usr/apps.sp3/free/papi/4.2.1/include -lpapi -L/usr/apps.sp3/free/papi/4.2.1/lib

2.実行します.

./a.out
x=49.500000
Real_time: 0.000009 Proc_time: 0.000002 Total flpins: 305
MFLOPS: 138.903839

ライブラリが見えない場合は,以下を実施してから,実行してください.

export LD_LIBRARY_PATH=/usr/apps.sp3/free/papi/4.2.1/lib:$LD_LIBRARY_PATH

6.7 エラーメッセージ

一番多いエラーメッセージと対応を示します.

6.7.1 メモリ不足

メモリ不足の場合は,コンパイラによってメッセージが異なりますが,バッチの場合はPBS側のエラーが表示されます.

  1. GNU

    Operating system error: Cannot allocate memory
    Out of memory
    
  2. PGI

    0: ALLOCATE: 1920000000 bytes requested; not enough memory
    
  3. intel

    forrtl: severe (41): insufficient virtual memory
    Image              PC                Routine            Line        Source
    ch                 0000000000476B5D  Unknown               Unknown  Unknown
    ch                 0000000000475665  Unknown               Unknown  Unknown
    ch                 0000000000450360  Unknown               Unknown  Unknown
    ch                 000000000043DFCF  Unknown               Unknown  Unknown
    ch                 0000000000415765  Unknown               Unknown  Unknown
    ch                 0000000000404462  Unknown               Unknown  Unknown
    ch                 0000000000402C7C  Unknown               Unknown  Unknown
    libc.so.6          00002BA16D91DBC6  Unknown               Unknown  Unknown
    ch                 0000000000402B79  Unknown               Unknown  Unknown
    
  4. PBS

    =>> PBS: job killed: mem 32050216kb exceeded limit 31457280kb
    ================================================
    
  5. 対策

    使用するメモリ量が指定したもの(あるいは実装)より多いために発生しています.次のような処置をお願いします.

    • バッチジョブ

      指定するメモリ量を多く指定してください.Sキューで不足の場合はS96など実装メモリの大きなキューを お使いください.

    • インタラクティブ

      インタラクティブでは,6GBの上限が設定されていますのでバッチキューをご利用ください. コンパイルなどもバッチを使って実行できます. 5.9 SSH直接ログイン なども参照ください.

6.7.2 配列外参照

エラーメッセージは次のように表示されます.

  1. GNU

    /var/spool/PBS/mom_priv/jobs/757.t2zpbs03.SC: line 5: 28740 Segmentation fault      ./outck
    ================================================
    
  2. PGI

    /var/spool/PBS/mom_priv/jobs/756.t2zpbs03.SC: line 5: 28674 Segmentation fault      ./outck
    ================================================
    
  3. intel

    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image              PC                Routine            Line        Source
    outck              0000000000402D72  Unknown               Unknown  Unknown
    outck              0000000000402C7C  Unknown               Unknown  Unknown
    libc.so.6          00002AB0F39E9BC6  Unknown               Unknown  Unknown
    outck              0000000000402B79  Unknown               Unknown  Unknown
    ================================================
    

6.7.3 配列外参照(MPIジョブ)

バッチでもほぼ同じですがMPIプロセスはこの「Segmentation fault」が発生するとシグナル”11” や “-5” としてMPI処理を終了します.

  1. GNU+openmpi

    [t2a006176:27110] *** Process received signal ***
    [t2a006176:27110] Signal: Segmentation fault (11)
    [t2a006176:27110] Signal code: Address not mapped (1)
    [t2a006176:27110] Failing at address: 0x17cb2c00
    [t2a006176:27111] *** Process received signal ***
    [t2a006176:27111] Signal: Segmentation fault (11)
    [t2a006176:27111] Signal code: Address not mapped (1)
    [t2a006176:27111] Failing at address: 0x17cb2c00
    [t2a006176:27110] [ 0] /lib64/libpthread.so.0(+0xf5d0) [0x2b08b38195d0]
    [t2a006176:27110] [ 1] /usr/lib64/libgfortran.so.3(+0xb5def) [0x2b08b3177def]
    [t2a006176:27110] [ 2] /usr/lib64/libgfortran.so.3(+0xb6ec2) [0x2b08b3178ec2]
    [t2a006176:27110] [ 3] /usr/lib64/libgfortran.so.3(+0xb78de) [0x2b08b31798de]
    --------------------------------------------------------------------------
    orterun noticed that process rank 1 with PID 27111 on node t2a006176 exited on signal 11
    (Segmentation fault).
    --------------------------------------------------------------------------
    
  2. PGI+openmpi

    [t2a006176:23516] *** Process received signal ***
    [t2a006176:23516] Signal: Segmentation fault (11)
    [t2a006176:23516] Signal code: Address not mapped (1)
    [t2a006176:23516] Failing at address: 0x1e18ab2c0
    [t2a006176:23517] *** Process received signal ***
    [t2a006176:23517] Signal: Segmentation fault (11)
    [t2a006176:23517] Signal code: Address not mapped (1)
    [t2a006176:23517] Failing at address: 0xffffffff9eadf440
    [t2a006176:23516] *** End of error message ***
    [t2a006176:23517] *** End of error message ***
    --------------------------------------------------------------------------
    orterun noticed that process rank 1 with PID 23517 on node t2a006176 exited on signal 11
    (Segmentation fault).
    --------------------------------------------------------------------------
    
  3. intel+openmpi

    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image              PC                Routine            Line        Source
    ck                 000000000040861A  Unknown               Unknown  Unknown
    ck                 000000000040843C  Unknown               Unknown  Unknown
    libc.so.6          00002B244C2A2BC6  Unknown               Unknown  Unknown
    ck                 0000000000408339  Unknown               Unknown  Unknown
    --------------------------------------------------------------------------
    orterun has exited due to process rank 1 with PID 22812 on
    node t2a006176 exiting without calling "finalize". This may
    have caused other processes in the application to be
    terminated by signals sent by orterun (as reported here).
    --------------------------------------------------------------------------
    
  4. GNU+mvapich2

    MPI process (rank: 1) terminated unexpectedly on t2a004094
    Exit code -5 signaled from t2a004094
    
  5. PGI+mvapich2

    MPI process (rank: 0) terminated unexpectedly on t2a004091
    Exit code -5 signaled from t2a004091
    MPI process (rank: 1) terminated unexpectedly on t2a004094
    
  6. intel+mvapich2

    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image              PC                Routine            Line        Source
    ck                 00000000004049AA  Unknown               Unknown  Unknown
    ck                 00000000004047CC  Unknown               Unknown  Unknown
    libc.so.6          00002B929D1AABC6  Unknown               Unknown  Unknown
    ck                 00000000004046C9  Unknown               Unknown  Unknown
    forrtl: severe (174): SIGSEGV, segmentation fault occurred
    Image              PC                Routine            Line        Source
    ck                 00000000004049AA  Unknown               Unknown  Unknown
    ck                 00000000004047CC  Unknown               Unknown  Unknown
    libc.so.6          00002B126C998BC6  Unknown               Unknown  Unknown
    ck                 00000000004046C9  Unknown               Unknown  Unknown
    MPI process (rank: 1) terminated unexpectedly on t2a006176
    Exit code -5 signaled from t2a006176
    
  7. 対策

    宣言した配列のインデックスの範囲外の添え字が使用されている場合に発生します. 初期値の設定漏れなどで発生する場合が多いようです.PGIコンパイラでは「-C」のオプションを 使用して次のようにして調査できます.

    > pgf95 -o check -C sample7lk.f wclock.c
    > ./check
    0: Subscript out of range for array a1 (sample7lk.f: 21)
       subscript=40000, lower bound=-1946283772, upper bound=32767, dimension=1
    >
    

    これはプログラムの21行目で配列名A1の範囲外を参照したというメッセージです.

    インテルコンパイラの場合は「-CB」を使用します.

    > ifort -o chk -CB check01.f
    > ./chk
    forrtl: severe (408): fort: (2): Subscript #1 of the array A has value 25000 which is greater than
    the upper bound of 100
    
    Image              PC                Routine            Line        Source
    chk                000000000046552E  Unknown               Unknown  Unknown
    

    これは,100の配列に対して添え字25000を使用したというメッセージです.

    MPIジョブの終了は,終了シグナルを親プロセスが受け取り,全プロセスに終了を配信して処理を終了するため, この手順で終了しない場合,終了を受け取らないプロセスがゾンビとなってしまう場合があります. そうならないために,添え字の範囲チェックを実施して,範囲外が発生した場合は, MPI-Abortルーチンをコールして終了するようにしてください.