4. ソフトウェア環境

4.1. 利用環境の切換え方法

本システムでは、moduleコマンドを使用することでコンパイラやアプリケーション利用環境の切り替えを行うことができます。

4.1.1. 利用可能なmodule環境の表示

利用可能なmodule環境はmodule availまたはmodule avaで確認できます。

$ module avail

読み込めるバージョンについてはTSUBAME計算サービスWebページのソフトウェア構成をご確認下さい。

4.1.2. module環境の設定情報表示

module環境の設定情報を確認したい場合、「module whatisモジュール名」を実行します。

$ module whatis intel/17.0.4.196
intel/17.0.4.196     : Intel Compiler version 17.0.4.196 (parallel_studio_xe_2017) and MKL

4.1.3. module環境のロード

module環境をロードしたい場合、「module load モジュール名」を実行します。

$ module load intel/17.0.4.196

バッチスクリプトにおいてロードするmoduleは、コンパイル時と同様のものをロードしてください。

4.1.4. module環境の表示

現在使用しているmodule環境を確認したい場合、「module list」を実行します。

$ module list
Currently Loaded Modulefiles:
  1) intel/17.0.4.196   2) cuda/8.0.61

4.1.5. module環境のアンロード

ロードしたmodule環境をアンロードしたい場合「module unload モジュール名」を実行します。

$ module list
Currently Loaded Modulefiles:
  1) intel/17.0.4.196   2) cuda/8.0.61
$ module unload cuda
$ module list
Currently Loaded Modulefiles:
  1) intel/17.0.4.196

4.1.6. module環境の初期化

ロードしたmodule環境を初期化したい場合、「module purge」を実行します。

$ module list
Currently Loaded Modulefiles:
  1) intel/17.0.4.196   2) cuda/8.0.61
$ module purge
$ module list
No Modulefiles Currently Loaded.

4.2. バッチスクリプト内での利用

バッチスクリプト内でmoduleコマンドを実行する場合、以下のとおり、バッチスクリプト内でmoduleコマンドの初期設定を行う必要があります。

【実行シェルがsh, bashの場合】

. /etc/profile.d/modules.sh
module load intel/17.0.4.196

【実行シェルがcsh, tcshの場合】

source /etc/profile.d/modules.csh
module load intel/17.0.4.196

4.3. Intelコンパイラ

本システムではコンパイラとして、Intelコンパイラ、PGIコンパイラおよびGNUコンパイラが利用できます。Intelコンパイラの各コマンドは以下のとおりです。

コマンド 言語 コマンド形式
ifort Fortran 77/90/95 $ ifort [オプション] source_file
icc C $ icc [オプション] source_file
icpc C++ $ icpc [オプション] source_file

利用する際は、moduleコマンドでintelを読み込んでください。--helpオプションを指定して頂くとコンパイラオプションの一覧が表示されます。

4.3.1. コンパイルの主なオプション

コンパイルの最適化オプションを以下に示します。

オプション 説明
-O0 すべての最適化を無効にします。
-O1 最適化を有効にします。コードサイズを大きくするだけで高速化に影響を与えるような一部の最適化を無効にします。
-O2 最適化を有効にします。一般的に推奨される最適化レベルです。
ベクトル化は O2 以上のレベルで有効になります。-Oオプションを指定しない場合、デフォルトでこちらが指定されます。
-O3 O2 よりも積極的に最適化を行い、融合、アンロールとジャムのブロック、IF 文の折りたたみなど、より強力なループ変換を有効にします。
-xCORE-AVX2 Intel プロセッサー向けのIntel アドバンスト・ベクトル・エクステンション 2 (Intel AVX2)、Intel AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel AVX2 命令セット対応のIntel プロセッサー向けに最適化します。
-xSSE4.2 Intel プロセッサー向けのIntel SSE4 高効率および高速な文字列処理命令、Intel SSE4 ベクトル化コンパイラ命令およびメディア・アクセラレーター命令、およびIntel SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel SSE4.2 命令セット対応のIntel プロセッサー向けに最適化します。
-xSSSE3 Intel プロセッサー向けのIntel SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel SSSE3 命令セット対応のIntel プロセッサー向けに最適化します。xオプションを指定しない場合、デフォルトでこちらが指定されます。
-qopt-report=n 最適化レポートを生成します。デフォルトでは、レポートは.optrpt 拡張子を持つファイルに出力されます。nには、0  (レポートなし) から5 (最も詳しい) の詳細レベルを指定します。デフォルトは 2 です。
-fp-model precise 浮動小数点演算のセマンティクスを制御します。浮動小数点データの精度に影響する最適化を無効にし、中間結果をソースで定義された精度まで丸めます。
-g -gオプションはオブジェクト・ファイルのサイズを大きくするシンボリック・デバッグ情報をオブジェクト・ファイルに生成するようにコンパイラに指示します。
-traceback このオプションは、ランタイム時に致命的なエラーが発生したとき、ソースファイルのトレースバック情報を表示できるように、オブジェクト・ファイル内に補足情報を生成するようにコンパイラに指示します。
致命的なエラーが発生すると、コールスタックの 16 進アドレス (プログラム・カウンター・トレース) とともに、ソースファイル、ルーチン名、および行番号の相関情報が表示されます。
マップファイルとエラーが発生したときに表示されるスタックの 16 進アドレスを使用することで、エラーの原因を特定できます。
このオプションを指定すると、実行プログラムのサイズが増えます。

コンパイルの推奨最適化オプションを以下に示します。本システムに搭載しているIntel Xeon E5-2680 v4は、Intel AVX2命令セットに対応していますので、-xCORE-AVX2オプションを指定することができます。-xCORE-AVX2を指定すると、コンパイラがソースコードを解析し、最適なAVX2、AVX、SSE命令を生成します。推奨最適化オプションは積極的な最適化を行い、かつ安全なオプションです。最適化のために計算の順序を変更する可能性があり、結果に誤差が生じる場合があります。

オプション 説明
-O3 O2 最適化を行い、融合、アンロールとジャムのブロック、IF 文の折りたたみなど、より強力なループ変換を有効にします。
-xCORE-AVX2 Intel プロセッサー向けのIntel アドバンスト・ベクトル・エクステンション 2 (Intel AVX2)、Intel AVX、SSE4.2、SSE4.1、SSSE3、SSE3、SSE2、SSE 命令を生成します。Intel AVX2 命令セット対応のIntel プロセッサー向けに最適化します。

上記のオプションを使用することにより、プログラムの性能が悪化した場合、最適化のレベルを-O2に下げるかベクトル化のオプションを変更してください。 また、結果が一致していない場合、浮動小数点のオプションも試してみてください。

4.3.3. Intel 64アーキテクチャーのメモリモデル指定

次のいずれかのメモリモデルを使用して実行バイナリを作成します。

メモリモデル 説明
small (-mcmodel=small) コードとデータのすべてのアクセスが、命令ポインター (IP) 相対アドレス指定で行われるように、コードとデータはアドレス空間の最初の 2GB までに制限されます。
-mcmodelオプションを指定しない場合、デフォルトでこちらが指定されます。
medium (-mcmodel=medium) コードはアドレス空間の最初の 2GB までに制限されますが、データは制限されません。コードは IP 相対アドレス指定でアクセスできますが、データのアクセスは絶対アドレス指定を使用する必要があります。
large (-mcmodel=large) コードもデータも制限されません。コードもデータもアクセスは絶対アドレス指定を使用します。

IP 相対アドレス指定は 32 ビットのみ必要ですが、絶対アドレス指定は 64 ビット必要です。 これは、コードサイズとパフォーマンスに影響します。 (IP 相対アドレス指定の方が多少速くアクセスできます。)

プログラム内の共通ブロック、グローバルデータ、静的データの合計が2GBを越えるとき、リンク時に次のエラーメッセージが出力されます。

<some lib.a library>(some .o): In Function <function>:
  : relocation truncated to fit: R_X86_64_PC32 <some symbol>
…………………
  : relocation truncated to fit: R_X86_64_PC32 <some symbol>

この場合は、-mcmodel=medium-shared-intelを指定してコンパイル/リンクして下さい。 medium メモリモデルまたは large メモリモデルを指定した場合、Intelのランタイム・ライブラリの適切なダイナミック・バージョンが使用されるように、-shared-intel コンパイラ・オプションも指定する必要があります。

4.4. PGIコンパイラ

PGIコンパイラの各コマンドは以下のとおりです。

コマンド 言語 コマンド形式
pgfortran Fortran 77/90/95 $ pgfortran [オプション] source_file
pgcc C $ pgcc [オプション] source_file
pgc++ C++ $ pgc++ [オプション] source_file

PGIコンンパイラにはLLVM版とno LLVM版の2種類があります。
LLVM版を使うには以下を実行します。

module load pgi

no LLVM版を使うには以下を実行します。

module load pgi-nollvm pgi

各コマンドの詳細は$ man pgcc等でご確認下さい。

4.5. 並列化

4.5.1. スレッド並列(OpenMPと自動並列化)

OpenMP、自動並列化によるスレッド並列によりプログラムの高速化ができます。

OpenMP、自動並列化を使用する場合のコマンド形式を以下に示します。

言語 コマンド形式
OpenMP
Fortran 77/90/95 $ ifort -qopenmp [オプション] source_file
C $ icc -qopenmp [オプション] source_file
C++ $ icpc -qopenmp [オプション] source_file
自動並列化
Fortran 77/90/95 $ ifort -parallel [オプション] source_file
C $ icc -parallel [オプション] source_file
C++ $ icpc -parallel [オプション] source_file

-qopt-report-phase=openmp オプションを使用することでOpenMP最適化フェーズのレポートを作成することができます。

-qopt-report-phase=par オプションを使用することで自動並列化フェーズのレポートを作成することができます。

4.5.2. プロセス並列(MPI)

Fortran/C/C++ プログラムに MPIライブラリをリンクし、プロセス並列プログラムを作成/実行することができます。MPIを使用する場合のコマンド形式を以下に示します。利用する際は、moduleコマンドで各MPIを読み込んでください。

MPIライブラリ 言語 コマンド形式
Intel MPI Fortran 77/90/95 $ mpiifort [オプション] source_file
C $ mpiicc [オプション] source_file
C++ $ mpiicpc [オプション] source_file
Open MPI Fortran 77/90/95 $ mpifort [オプション] source_file
C $ mpicc [オプション] source_file
C++ $ mpicxx [オプション] source_file
SGI MPT Fortran 77/90/95 $ mpif90 [オプション] source_file
C $ mpicc [オプション] source_file
C++ $ mpicxx [オプション] source_file

4.6. GPU環境

本システムではGPU(NVIDIA TESLA P100)の利用環境を提供しております。

4.6.1. インタラクティブジョブの実行・デバッグ

ログインノード(login, login0, login1)には、GPUを搭載しておらず、コンパイル、リンクのみ実行可能です。 また、ログインノードにおける高負荷プログラムの実行は制限されています

インタラクティブでの実行、デバックについては、バッチシステムを使用して実行可能です。 詳細については、インタラクティブジョブの投入を参照ください。

4.6.2. 対応アプリケーション

現在のGPU対応アプリケーションは次の通りです。(2017.12.18現在)

  • ABAQUS 2017 --- ABAQUS利用の手引(別冊) を参照ください。
  • NASTRAN 2017.1 --- NASTRAN利用の手引(別冊) を参照ください。
  • ANSYS 18 --- ANSYS 利用の手引(別冊) を参照ください。
  • AMBER 16 --- AMBER利用の手引(別冊) を参照ください。
  • Maple 2016 --- Maple利用の手引(別冊) を参照ください。
  • Mathematica 11.2 --- Mathematica利用の手引(別冊) を参照ください。
  • MATLAB --- MATLAB利用の手引(別冊) を参照ください。
  • Allinea Forge --- Allinea Forge利用の手引(別冊) を参照ください。
  • PGI Compiler --- PGI コンパイラ 利用の手引(別冊) を参照ください。

他のアプリケーションにつきまても、順次展開してまいります。

4.6.3. CUDA 対応のMPI

CUDA版に対応したMPI環境を用意しております。

OpenMPI + gcc環境

# CUDA、Open MPI環境の読込(gccは、デフォルトで設定されています。)
module load cuda openmpi

OpenMPI + pgi環境

# CUDA、PGI環境の読込(最初にコンパイラ環境を読み込みます。)
module load cuda pgi
# Open MPI環境の読込(コンパイラに応じたOpenMPIの環境が設定されます。)
module load openmpi

Info

以前記載されておりましたPGIバンドル版のopenmpi/2.1.2-pgi2017のバージョン指定は現在は不要となっております。

OpenMPI + Intel環境

# CUDA、Intel環境の読込(最初にコンパイラ環境を読み込みます。)
module load cuda intel
# Open MPI環境の読込(コンパイラに応じたOpenMPIの環境が設定されます。)
module load openmpi

4.6.4. NVIDIA GPUDirect

現在、NVIDIA GPUDirect (GPUDIRECT FAMILY)としては、4つの機能(GPUDIRECT SHARED GPU SYSMEM、GPUDIRECT P2P、GPUDIRECT RDMA、GPUDIRECT ASYNC)があります。(2017.12.18現在)

このうち、TSUBAME3.0 では、GPUDIRECT SHARED GPU SYSMEM、GPUDIRECT P2P、GPUDIRECT RDMA をサポートしております。 - GPUDIRECT SHARED GPU SYSMEM(Version1)

MPIの送受信バッファにCUDA pinnedメモリやデバイスメモリのアドレスを直接指定することができる機能です。デバイスメモリのアドレスを指定した場合には実際にはデータがホストメモリ上のバッファを経由して転送されます。

  • GPUDIRECT P2P(Version2)

PCI-Express、NVLinkを経由したGPU間の直接データ転送(P2P)の機能です。TSUBAME 3.0では、ノードあたり、4GPUを搭載しておりますが、1つのCPUあたり、PLX switch を介して 2つのGPUに接続しております。4GPU間は、高速なNVLinkで接続されています。

  • GPUDIRECT RDMA(Version3)

ホストメモリを介することなくGPUとインターコネクト間(TSUBAME3.0では、Intel Omni-Path)で直接データ転送(RDMA)をすることにより異なるノードのGPU間の高速なデータ転送を実現する機能です。

  • GPUDIRECT ASYNC

ホストメモリを介することなくGPUとインターコネクト間で非同期通信する機能です。現在、TSUBAME3.0の のIntel Omni-Pathでは、未対応です。

参考)http://on-demand.gputechconf.com/gtc/2017/presentation/s7128-davide-rossetti-how-to-enable.pdf

GPUDirectについては、以下のURLも参照ください。

4.6.5. GPUDirect RDMA

OPA10.9環境下でGPUDirect RDMAを実行したい場合、MPI_Init()の前にcudaSetDevice()を呼ぶ必要があります。 https://www.intel.com/content/dam/support/us/en/documents/network-and-i-o/fabric-products/Intel_PSM2_PG_H76473_v12_0.pdf p.15

CUDA support is limited to using a single GPU per process.
You set up the CUDA runtime and pre-select a GPU card (through the use of cudaSetDevice() or a similar CUDA API) prior to calling psm2_init() or MPI_Init(), if using MPI.
While systems with a single GPU may not have this requirement, systems with multiple GPU may see non-deterministic results without proper initialization.
Therefore, it is strongly recommended that you initialize the CUDA runtime before the psm2_init() or MPI_Init() call.

ご自身のコード内で上記修正を行うか、上記をopenmpi内で行うように修正されたopenmpi/3.1.4-opa10.10-t3がTSUBAMEにはインストールされております。 module load cuda openmpi/3.1.4-opa10.10-t3でご利用が可能です。

OpenMPIでのGPUDirect RDMAの実行方法を以下に示します。以下、2ノード、MPI×2での実行例になります。

# module load cuda openmpi/3.1.4-opa10.10-t3
# mpirun -np 2 -npernode 1 -x PSM2_CUDA=1 -x PSM2_GPUDIRECT=1 -x LD_LIBRARY_PATH -x PATH [プログラム]
  • PSM2_CUDA --- Omni-PathでのCUDA有効
  • PSM2_GPUDIRECT --- GPUDirect RDMA有効

4.6.6. GPUのCOMPUTE MODEの変更

資源タイプFのf_nodeを利用した場合、GPUのCOMPUTE MODEを変更することが出来ます。 GPUのCOMPUTE MODEを変更するには、f_nodeを指定した上で、ジョブスクリプトの中で、 #$ -v GPU_COMPUTE_MODE=<利用するモード> を指定してください。 利用可能なモードは以下の3つです。

モード 説明
0 DEFAULTモード
1つのGPUを複数のプロセスから同時に利用できる。
1 EXCLUSIVE_PROCESSモード
1つのGPUを1プロセスのみが利用できる。1プロセスから複数スレッドの利用は可能。
2 PROHIBITEDモード
GPUへのプロセス割り当てを禁止する。

以下はスクリプトの例となります。

1
2
3
4
5
6
7
#!/bin/sh
#$ -cwd
#$ -l f_node=1
#$ -l h_rt=1:00:00
#$ -N gpumode
#$ -v GPU_COMPUTE_MODE=1
/usr/bin/nvidia-smi

インタラクティブで利用する場合、qrshは以下のような形となります。

$ qrsh -g [TSUBAME3グループ] -l f_node=1 -l h_rt=0:10:00 -pty yes -v TERM -v GPU_COMPUTE_MODE=1 /bin/bash