北陸先端科学技術大学院大学殿...2019/11/01  · module名 コンパイラ mpi...

101
Confidential © Copyright 2018 Hewlett Packard Enterprise Development LP. The information contained herein is subject to change without notice. SGI UV3000 並列化プログラミング講習会 日本ヒューレット・パッカード株式会社 2019年11月1日 北陸先端科学技術大学院大学殿

Upload: others

Post on 30-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential © Copyright 2018 Hewlett Packard Enterprise Development LP. The information contained herein is subject to change without notice.

SGI UV3000並列化プログラミング講習会

日本ヒューレット・パッカード株式会社

2019年11月1日

北陸先端科学技術大学院大学殿

Page 2: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

2Confidential ©2017 SGI

1. システム概要

2. ジョブ投入方法

3. ジョブ投入スクリプト

4. コンパイルオプション

5. 数値計算ライブラリ

6. ファーストタッチとデータ配置

7. デバッグ

8. 実習:コンパイル・実行方法

9. 実習:自動並列化・OpenMP

Contents

Page 3: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 3

システム概要

Page 4: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

4Confidential ©2017 SGI

UV3000

Model SGI UV3000

total

台数 1式(4ラック)

IRU数 16

ブレード数 128

CPU71.27TFLOPS

256CPU・1536コア

MEM32TB

16GB * 2048DIMM

Disk外部磁気ディスク装置 160TB(物理容量)

SGI Infinite Storage 5100

I/O I/F Dual Port 16Gbps FC HBA

NW I/F Dual Port 10G

ブレード

CPUIntel Xeon E5-4655 v3 * 2CPU6c/2.9GHz/30M/9.6GT/s/135W

メモリ16GB DDR4 * 2DIMM * 4ch / CPU

2133 MT/s

Page 5: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

5Confidential ©2017 SGI

InfinitStorage 5100

Model SGI InfinitStorage 5100

台数 1

シャーシ 4U エンクロージャ

コントローラ Active/Active controller

ホストインタフェース 4x 16Gb Fcポート

キャッシュサイズ816GB

16GB システムキャッシュ+800GB SSD

ディスク4TB NL-SAS HDD x42800GB SAS SSD x2

Page 6: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

6Confidential ©2017 SGI

ログインサーバ

6

Model SGI Rackable C2112-GP2

台数 1

CPU 2x Intel Xeon E5-2667 v3

メモリ128GB

16GB * 8DIMM

ディスク 1TB SATA HDD x2

ネットワーク4x Gigabit Ethernet

2x 10Gigabit Ethernet

Page 7: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

7Confidential ©2017 SGI

接続図

学内ネットワーク10GbE

16Gbps FCDAS接続

UV3000 Login + PMT

NFSサーバホーム領域

Page 8: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

8Confidential ©2017 SGI

サーバ室

Page 9: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

9Confidential ©2017 SGI

UV3000 Blade

Intel Xeon E5-4655v3Intel Xeon E5-4655v3

QP I

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM

32GB DDR4 DIMM Q

P IQ

P IQ

P I

QP I

QP I

QP I

QP I

UV Hub

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

16GB DDR4 DIMM

NL612Channels

UV3000 ブレードブロックダイアグラム

L3 shered cache 30MB

core 1

core 2

core 3

core 4

core 5

core 0

L3 shered cache 30MB

core 1

core 2

core 3

core 4

core 5

core 0

Page 10: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

10Confidential ©2017 SGI

トポロジー

図面は、1/8 のトポロジを示しています。キューブの各頂点が 2 個のルータブレードに接続します。

Page 11: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

11Confidential ©2017 SGI

– OS SUSE Linux Enterprise Server 12

– SGI® Performance Suite

– SGI Accelerate

– SGI MPT

– Intel® Parallel Studio XE 2016 update2、2017 update1

– PGI compiler 2017

– Gaussian 16

ソフトウェア

Page 12: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

12Confidential ©2017 SGI

– UV3000を利用するには、ログインサーバにログインしてジョブの投入を実行します。

ログインサーバへのログイン

ホスト名 uv.jaist.ac.jp

• ログインサーバへはsshでログインが可能で、ファイル転送はscpが利用できます。

$ ssh -l <ユーザ名> uv

Page 13: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

13Confidential ©2017 SGI

– 各ユーザには、ホーム領域が割り当てられています。ホーム領域はファイルサーバ上に存在し、NFS接続によって各システムに共有されています。ホーム領域は、各システムにログインした時の作業領域です。

– また、UV3000(altix-uv)においては、ローカルに接続されたwork領域(/work)が利用できます。work領域はローカルディスクなのでI/O WAITが起こりにくいのでご利用をお勧めします。ただし、データはバックアップしていませんので、計算結果やconfig等の重要データはご自分のホームディレクトリに移動させてください。

– work領域はuvにもNFSマウントされています。

システムのストレージ

Page 14: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

14Confidential ©2017 SGI

– moduleコマンドを使用することで、プログラミング環境を切り替えることができます。

– デフォルトでログインした場合は自動的にmpi/PrgEnv-intel_sgiがロードされます。

– mpi/PrgEnv-intel_sgiはインテルコンパイラの環境とSGI MPTが利用できる設定です。

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

$ module avail

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

$ module load mpi/PrgEnv-intel_sgi

– バッチスクリプト内で標準以外の環境を使う場合は、バッチスクリプト内でmoduleコマンドの初期設定を行う必要があります。

source /etc/profile.d/modules.sh

module load mpi/PrgEnv-intel

– csh系の場合は、“/etc/profile.d/modules.csh“に置き換えてください。

プログラミング環境の切替

Page 15: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

15Confidential ©2017 SGI

Module名 コンパイラ MPI

Intel/16.0.2 Intel parallel_studio_xe_2016 X

Intel/17.0.1 Intel parallel_studio_xe_2017 X

mpi/PrgEnv-intel-2016.2 Intel parallel_studio_xe_2016 Intel MPI

mpi/PrgEnv-intel

mpi/PrgEnv-intel-2017.1

Intel parallel_studio_xe_2017 Intel MPI

mpi/PrgEnv-intel-2016.2_sgi Intel parallel_studio_xe_2016 SGI MPT

mpi/PrgEnv-intel_sgi

mpi/PrgEnv-intel-2017.1_sgi

Intel parallel_studio_xe_2017 SGI MPT

pgi/17.1 PGI compiler 17.1 X

pgi/PrgEnv-pgi PGI compiler 17.1 openMPI

主なmodulefile

Page 16: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

16Confidential ©2017 SGI

– 本システムでは、ジョブ管理システムとしてPBS Professional(以降PBS) が導入されています。ジョブ実行には、インタラクティブな実行と、ジョブ・スクリプト・ファイル使用した実行があります。ジョブ・スクリプト・ファイルの作成方法は、「ジョブ・スクリプトの作成」をご参照ください。

– ユーザは、ジョブの実行条件を明示して、ジョブを実行キューに投入する必要があります。

ジョブ管理システム PBS Professional

キュー vnode コア数 メモリ 持続時間 同時実行(ユーザあたり)

優先度

TINY 1-4 1-24 ~512GB 6 hours - (1) 160

SINGLE 1-2 1-12 128-256GB 1 weeks 32 (16) 150

SMALL 4-8 12-48 256GB-1TB 1 weeks 16 (6) 130

MEDIUM 8-32 48-192 1TB-4TB 3 days 4 (1) 90

LARGE 32-64 192-384 4TB-8TB 2 days 2 (1) 70

XLARGE 64-128 384-768 4TB-16TB 2 days 1 (1) 30

APPLI 1-2 1-12 128GB-256GB 3 weeks 16 (6) 110

LONG-S 1-8 12-48 256GB-1TB 2 weeks 3 (1) 110

LING-M 8-32 48-192 1TB-4TB 1 weeks 1 (1) 90

LONG-L 32-96 192-576 4TB-12TB 5 days 1 (1) 30

Page 17: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

17Confidential ©2017 SGI

– UV3000システムは最大で256ソケット(1536コア)32TBのSMPとして使用することが可能です。

※SMP(エスエムピー)とは、Symmetric Multiple Processorの略で、複数のCPUによって処理を分散させるマルチプロセッサの方式のひとつで、各CPUを同等に扱って並列処理を行わせる方式のことで「対称型マルチプロセッサ」とも訳されます。

1プロセスから32TBまでのメモリにアクセスが可能です。(JAISTのPCクラスタでは,並列プログラムを使わないかぎり、1プロセスは64GBまでのメモリしか利用で来ません)簡単に言えば1536コア32TBを1つのOSで使用できるパソコンであると思ってください。

実際に32TBのメモリを使用する場合はセンターに申請が必要となります。

– 大規模なメモリを使用して計算を行うことが可能

– インテルコンパイラのparallelオプションを使用し、既存のソースを自動的に並列化を行うことが可能

– 実行に向いている計算

– インメモリー上で大規模なメモリを使う計算

– 自動並列化を行ってopenMPを実行するプログラム

– 実行に向いていない計算

– ディスクI/Oを多用する計算

(work用ディスクは接続されていますがOS全体で使用するためI/O性能は低めになります。)

– プログラムを実行するときの注意

– 標準出力への大量の書き出しはシステムに不具合を起こす場合がありますので避けてください

実行するプログラムについて

Page 18: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 18

ジョブ投入方法

Page 19: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

19Confidential ©2017 SGI

– 基本的なジョブ投入方法は次の通りになります。job scriptはジョブ投入用シェルスクリプトです。

$ qsub <job script>

以下の例では、ホーム・ディレクトリのユーザディレクトリに、計算に必要なデータが入っており、そのディレクトリからqsubコマンドを利用してジョブを投入する例です。“ユーザ名”及び、“ディレクトリ名“は必要に応じ読み替えてください。 /work/Samplesにサンプルプログラムがあります。

ジョブ投入方法

$ cat test_prog.sh#!/bin/bash#PBS -q TINY#PBS -l select=1:ncpus=1:mem=1gb#PBS -N sample_JOB#PBS -j oecd ${PBS_O_WORKDIR}dplace ./sample.out

---ジョブの投入---$ qsub test_prog.sh---ジョブの終了後---$ cat /user1/xxx/ユーザ名/ディレクトリ名/sample_JOB.oジョブID

Page 20: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

20Confidential ©2017 SGI

– スクリプトによる実行ではなく、インタラクティブな実行は次のコマンドを利用します。

$ qsub -I

ジョブの投入が成功しますと、投入ジョブに対してジョブIDが割り当てられます。exitコマンドで終了します。

ジョブ投入方法(インタラクティブ)

$ qsub -I -l select=1:ncpus=4qsub: waiting for job 4107.altix-uv to startqsub: job 4107.altix-uv ready

altix-uv /home/sgise2>altix-uv /home/sgise2> cd /work/sgise2altix-uv /work/sgise2> ./mathprogram1altix-uv /work/sgise2> INTEGRAL[ 0.1 0.9: 100000000 STEPS] altix-uv /work/sgise2> exitlogout

qsub: job 4107.altix-uv completed

Page 21: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

21Confidential ©2017 SGI

qsubの代表的なオプション

オプション 説明

-q queue_name ジョブを投入するキューの指定。指定がない場合は、デフォルトキュークラスである“TINY”へ投入されます。

-N name ジョブ名の指定。指定しない場合、ジョブ・スクリプトの名前にてSTDINに設定されます。(空白文字は使うことはできません)。

-a date_time 指定した日時にジョブを投入するように指定します。date_timeは[[[[CC]YY]MM]DD]hhmm[.SS]というような形式で指定します。CCYYは西暦、MMDDは月日、hhmm.SSは時分秒です。

-j oe | eo stdout(標準出力)、stderr(標準エラー出力)の出力ファイルを統合。"oe"を指定した場合は、これらの出力をまとめてstdoutに出力します。"eo"を指定した場合は、出力をまとめてstderrに出力します。

-o path_name stdoutの出力ファイル名を指定。無指定だと"ジョブ名.oジョブ番号"となります。投入時のディレクトリに対する相対パス、絶対パス、ホスト名:パスというような指定方法があります。

-e path_name stderrの出力ファイル名を指定。無指定だと"ジョブ名.eジョブ番号"となります。投入時のディレクトリに対する相対パス、絶対パス、ホスト名:パスというような指定方法があります。

-m mail_option メールの送信の設定。mail_optionには以下のものがあります。a : ジョブが中止された場合に送信b : ジョブの実行が開始された際に送信e : ジョブの実行が終了した際に送信n : メール送信しない

-M mail_address メール受信者の設定。指定しない場合、ジョブを投入したユーザーアカウントが受信者となります。

-l keyword=value ジョブのリソース(コア数、メモリ、実行時間など)要求の指定。利用するノード数、コア数の指定の仕方は次の『select文について』をご覧ください。

Page 22: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

22Confidential ©2017 SGI

UV3000はPBSによって仮想ノードを作成しジョブを実行する仕組みになっています。

PBSで作成する仮想ノードの単位は1CPU (6コア)128GBとなります。

JAISTのUV3000の場合は 256CPU(1536コア)32TBのシステムですので256個の仮想ノードに分かれて管理されています。

仮想ノードの指定はselect文を使用します。

仮想ノードの設定方法は、仮想ノードの数を指定して設定する方法と使用するコア数を指定して使用する方法の2通りあります。

以下は24コアを利用してMPIを実行する例となります。

仮想ノードの数を指定する場合

qsub –l select=4:ncpus=6:mpiprocs=6

コア数を指定する場合

qsub –l select=1:ncpus=24:mpiprocs=24

仮想ノードについて

Page 23: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

23Confidential ©2017 SGI

利用するノード数、コア数などを指定する場合はselect文を用います。ジョブ投入オプションに記述します。

-l select=N1:ncpus=N2

MPIジョブの場合は、次のようになります。

-l select=N1:ncpus=N2:mpiprocs=N3

N1:ジョブが利用するノード数を指定します。

N2:計算で利用する、1計算ノード内のコア数を指定します。

N3:計算で利用する、1計算ノード内のMPIプロセスの数を指定します。

MPIジョブの場合は、N3= N2となります。

MPIとOpenMPのハイブリッドジョブの場合は、N3=N2 / (OpenMPのスレッド数) となります。

ノード毎にN2、N3の値が変わる場合には、次のフォーマットになります。+で繋げて下さい。(書式に注意)

-l select=N1:ncpus=N2:mpiprocs=N3+M1:ncpus=M2:mpiprocs=M3

select文について

Page 24: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

24Confidential ©2017 SGI

– ジョブの確認にはqstatコマンドを用います。以下に出力例を示します。

ジョブ確認方法

uv /home/sgise2> qstatJob id Name User Time Use S Queue------------------- -------------------- -------------------- ----------- -- -----3627.altix-uv STDIN s1520207 316:42:1 R SMALL3629.altix-uv STDIN s1520207 84:22:43 R SMALL3630.altix-uv sym-62 s1420207 00:00:37 R SINGLE3793.altix-uv sym-62 s1420207 100:35:3 R SINGLE3854.altix-uv translate_full s1520207 366:04:0 R APPLI

qstatコマンドにより参照可能な情報です。

• Job id 投入時に割り当てられたジョブID

• Name ジョブ名

• User 投入ユーザ

• Time Use 経過したCPU時間

• S ジョブステータス

• Queue ジョブが属するキュー

ジョブステータスは主に以下のものを取ります。

• Q キューに投入され実行待ち

• R 実行中

• E 実行済みで終了処理中

• S サーバによって中断中

Page 25: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

25Confidential ©2017 SGI

オプション 説明

-u user_name 指定したユーザのジョブの状態を表示します。-f (JOBID) ジョブの詳細な状況を表示します。JOBIDを省略すると、すべてのジョブに

ついての詳細な状況を表示します。-Q キューの状況を表示します。-s ジョブコメントおよびその他の情報が表示されます。キューイング中のジョブは

実行待ちになっている理由が表示されます。

ジョブの確認方法

• qstatの主なオプション

Page 26: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

26Confidential ©2017 SGI

ジョブの確認方法

• 特定のジョブの詳細な状態を確認したいときには”qstat –f JOBID”で確認できます。• 本システムにて設定されているキュークラスの状態を確認したい場合は、“qstat -Q”コマンドを利用します。

uv /home/sgise2> qstat -QQueue Max Tot Ena Str Que Run Hld Wat Trn Ext Type---------------- ----- ----- --- --- ----- ----- ----- ----- ----- ----- ----LONG-L 0 0 yes yes 0 0 0 0 0 0 ExecSINGLE 32 19 yes yes 0 19 0 0 0 0 ExecSMALL 16 7 yes yes 0 7 0 0 0 0 ExecMEDIUM 4 0 yes yes 0 0 0 0 0 0 ExecLARGE 2 0 yes yes 0 0 0 0 0 0 ExecXLARGE 1 0 yes yes 0 0 0 0 0 0 ExecAPPLI 16 3 yes yes 0 3 0 0 0 0 ExecLONG-S 4 0 yes yes 0 0 0 0 0 0 ExecLONG-M 2 0 yes yes 0 0 0 0 0 0 ExecTINY 0 0 yes yes 0 0 0 0 0 0 Exec

• Max :Maximum (該当キューで実行可能なジョブ数の最大値)

• Tot :Total (該当キューに投入されたジョブの総数)

• Ena :Enabled(Enabled:該当キューは利用可能)

• Str :Status (該当PBSサーバのステータス)

• Que :Queued (待機状態のジョブの数)

• Run :Running (実行状態のジョブの数)

• Hld :Held (保留状態のジョブの数)

• Wat :Waiting (待機状態のジョブの数)

• Trn :Transit (移行状態のジョブの数)

• Ext :Exiting (実行済みで終了状態のジョブの数)

• Type :execution あるいは routing (executionは、該当キューが実行可能との意味)

Page 27: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

27Confidential ©2017 SGI

– ジョブをキャンセルするにはqdelコマンドを利用します。実行中のジョブ及び、待機中のジョブをキャンセルする事が可能です。qdelコマンドでキャンセル可能なジョブは自分の投入したジョブに限ります。

$ qdel <JOBID>

ジョブのキャンセル

Page 28: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

28Confidential ©2017 SGI

– dplaceコマンド

dplaceコマンドは複数のプロセスをCPUコアに割り当て固定するコマンドです。並列プログラムの実行時には、dplaceコマンドを指定されることを推奨します。

自動並列化/OpenMPプログラムとMPIプログラムでオプションが異なりますのでご注意ください。数字のあるオプションですが、実行CPU数がいくつであっても変わりません。

※dplaceコマンドはプロセスとメモリのアロケーションをコントロールします。

プロセスの参照データはプロセスが最初に動作したCPUの近くのメモリに展開されます。

その為、プロセスのCPU間の移動を避ける事により、参照データの局所性

(キャッシュ利用の効率化、メモリ配置の最適化)を利用した最適なプログラム実行環境をサポートします。

プロセス配置

Page 29: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

29Confidential ©2017 SGI

– シリアルプログラムでの利用

実行モジュールの前にdplaceコマンドを指定してください。

プロセス配置

$ dplace ./a.out

• 自動並列化/OpenMPプログラムでの利用(intel conpiler 17.0.0以前でコンパイラされたプログラムの場合)dplaceコマンドでは-x2オプションを指定してください。

$ export OMP_NUM_THREADS=8

$ export KMP_AFFINITY=disabled

$ dplace -x2 ./a.out

• Intel compiler 17.0.1より管理スレットが立たないように仕様が変更されました。そのため、-x2のオプションは不要となりました。

• exportコマンドはbash系のコマンドです。csh系の場合は”setenv OMP_NUM_THREADS 8”の様に入力してください。

• PBSのバッチ・ジョブでは、OMP_NUM_THREADSはqsubコマンド実行時に指定したCPU数が自動的に設定されます。

Page 30: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

30Confidential ©2017 SGI

– SGI MPTを使ったMPIプログラムでの利用

dplaceコマンドの-s1オプションを使用してください。

プロセス配置

$ mpiexec_mpt –np 8 dplace -s1 ./a.out

※PBSのバッチ・ジョブでは、mpiexec_mptを利用ください。

-npオプションで指定するMPIプロセス数はqsubコマンド実行時に指定したmpiprocsが自動的に設定されます。

Page 31: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

31Confidential ©2017 SGI

オプション 内容

-x CPUに配置しないプロセスを指定します。ビットマスクになっています。例えば6を指定すると、2番目と3番目のプロセスをCPUに配置しません。自動並列化/OpenMPプログラムを実行すると、OMP_NUM_THREADSで指定した数のプロセスの他に1つの管理プロセスが起動されます(管理プロセスは2番目のプロセスとして起動されます)。-x2オプションはこの管理プロセス以外のプロセスをCPUに割り当てることを指示するものです。

-s -sオプションを指定すると最初のn個のプロセスをCPUに配置しません。-s1オプションでMPIプログラムはmpirun、mpiexec_mptでN+1個のプロセスが起動されます。最初のプロセスは実際にはインアクティブな状態です。-s1を指定してインアクティブなプロセスをCPUに割り当てません。

プロセス配置

• dplaceのオプション-x、–s ともにCPUに配置しないプロセスを指定するものです。

Page 32: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

32Confidential ©2017 SGI

– omplaceコマンド (SGI MPTのみ使用可能)

omplaceコマンドは、プロセス/スレッドをコアに固定するコマンドです。プロセス並列ジョブやハイブリッドジョブで使用します。プロセスの配置を変更したい場合に使用することができます。計算ノード内の全てのコアを使用しない場合にプロセス配置を変更し、CPU1とCPU2に割り当てることで性能が向上する可能性があります。

プロセス配置

$ export OMP_NUM_THREADS=4$ export KMP_AFFINITY=disabled$ mpiexec_mpt –np 8 omplace -nt $OMP_NUM_THREADS ./a.out

※-npオプションはMPIプロセス数を、-ntオプションはOpenMPスレッド数を指定します。

Page 33: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 33

ジョブ投入スクリプト

Page 34: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

34Confidential ©2017 SGI

– 並列化されていないジョブの例

2行目から6行目の様に”#PBS”で始まる行はqsubコマンドに指定するオプションをスクリプト内に記述するものです。

(#PBS行は、シェルにはコメント行として解釈されますが、qsubコマンドにはオプション指定行として解釈されます)

ジョブスクリプトの作成

1. #!/bin/bash2. #PBS -q TINY3. #PBS -l select=1:ncpus=14. #PBS -N serial_JOB5. #PBS -o serial_out_file6. #PBS -j oe7. source /etc/profile.d/modules.sh8. module load PrgEnv-intel9. cd ${PBS_O_WORKDIR}10. dplace ./a.out

1行目:スクリプトをbashの文法で書くように宣言。

2行目:キュー名を指定。

3行目:利用するCPU数(並列度)を指定。1ノードでの実行ではselect定義は“1”になります。

CPU数(並列度)、メモリ量を指定しない場合、各キュークラスのデフォルト値が利用可能なリソースとなります。

4行目:ジョブ名を指定。

5行目:標準出力(stdout)を出力するファイルを指定。

6行目:標準エラー出力(stderr) を標準出力(stdout)に結合する指定。

7行目:moduleコマンドを利用するための環境設定。csh系の場合は“modules.csh”を入力してください。

8行目:moduleコマンドでIntelコンパイラの環境を読み込み。 *標準環境(SGI MPT)の場合は7,8行目は不要です。

9行目:実行ファイルがあるディレクトリへの移動。

10行目:プログラムの実行。

並列処理されていないプログラムの実行にはdplaceコマンド(オプションなし)を指定してください。

Page 35: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

35Confidential ©2017 SGI

– 自動並列化/OpenMP並列化ジョブの例

並列数(OMP_NUM_THREADS環境変数)は、デフォルトでqsub実行時の-l selectのncpusオプションで指定されたCPU数が設定されています。並列数を変更する場合は、スクリプト内で環境変数により並列数を指定してください。

ジョブスクリプトの作成

1. #!/bin/bash 2. #PBS -q TINY3. #PBS -l select=1:ncpus=64. #PBS -N omp_JOB5. #PBS -o omp_out_file6. #PBS -j oe7. source /etc/profile.d/modules.sh8. module load PrgEnv_intel9. export OMP_NUM_THREADS=610. export KMP_AFFINITY=disabled11. cd ${PBS_O_WORKDIR}12. dplace -x2 ./a.out もしくは dplace ./a.out

3行目:利用するCPU数(並列度)を指定。

*標準環境(SGI MPT)の場合は7,8行目は不要です。

9行目:OpenMP並列ジョブの並列度を指定する環境変数。 csh系の場合は“setenv OMP_NUM_THREADS 6”の様に入力してください。

この変数は必ず設定を行ってください。

10行目:インテルコンパイラのAFFINITYをdisabledにする。

csh系の場合は“setenv KMP_AFFINITY disabled”の様に入力してください。

11行目:実行ファイルがあるディレクトリへの移動。

12行目:プログラムの実行。

Intel compiler 17.0.0以前の自動並列化及びOpenMP並列プログラムの実行にはdplace -x2コマンド(オプション要)を指定してください。

Page 36: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

36Confidential ©2017 SGI

– スクラッチ領域を使ったジョブの例

UV3000には、I/Oが多い計算向けにwork領域(/work)があります。/work以下に自分のアカウントのディレクトリを作成し、計算実行途中のデータ入出力に利用してください。計算実行後はwork領域にデータを残さないようにしてください。計算実行後にスクラッチ領域に残されたデータは、予告なく削除されることがあります。

以下は実行ディレクトリで中間ファイルを作成するようなプログラムを実行する場合のスクリプト例です。プログラム中でアウトプット場所を指定できる場合は、コピー処理は不要です。

ジョブスクリプトの作成

1. #!/bin/bash 2. #PBS -q TINY3. #PBS -l select=1:ncpus=64. #PBS -N smp_JOB5. #PBS -o smp_out_file6. #PBS -j oe7. source /etc/profile.d/modules.sh8. module load PrgEnv-intel9. export OMP_NUM_THREADS=610. export KMP_AFFINITY=disabled11. cp –rp ${PBS_O_WORKDIR}/program /work/ユーザ名/12. cd /work/ユーザ名/program13. dplace -x2 ./a.out もしくは dplace ./a.out

2行目:キュー名を指定。

*標準環境(SGI MPT)の場合は7,8行目は不要です。

11行目:実行ファイルがあるディレクトリをスクラッチ領域へコピー。

12行目:実行ファイルがあるディレクトリへの移動。

13行目:プログラムの実行。

Intel compiler 17.0.0以前の自動並列化及びOpenMP並列プログラムの実行にはdplace -x2コマンド(オプション要)を指定してください。

Page 37: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

37Confidential ©2017 SGI

– MPI並列化ジョブの例(SGI MPTを利用する場合)

ジョブ実行時にqsubオプションで確保するCPU数を-l selectのncpusオプション、mpiprocsオプションで指定してください。

ジョブスクリプトの作成

1. #!/bin/bash 2. #PBS -q GEN3. #PBS -l select=2:ncpus=4:mpiprocs=44. #PBS -N sgimpt_JOB5. #PBS -o sgimpt_out_file6. #PBS -j oe7. cd ${PBS_O_WORKDIR}8. mpiexec_mpt dplace -s1 ./a.out

3行目:利用するCPU数(並列度)とMPIプロセス数を指定。

8行目:MPI並列ジョブを実行するにはmpiexec_mptコマンドを利用します。

並列度は-npオプションの後に指定しなくても自動的に読み込まれます (PBSを経由して利用する場合のコマンドです)。

SGI MPTを利用したMPI並列プログラムの実行にはdplace -s1コマンド(オプション要)を指定してください。

Page 38: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

38Confidential ©2017 SGI

– SGI MPTを利用したハイブリッド並列(MPI+OpenMP)ジョブの例

ジョブ実行時にqsubオプションで確保するCPU数を-l selectのncpusオプション、mpiprocsオプションで指定してください。

ジョブスクリプトの作成

1. #!/bin/bash 2. #PBS -q SMALL3. #PBS -l select=4:ncpus=6:mpiprocs=24. #PBS -N hybrid_JOB5. #PBS -o hybrid_out_file6. #PBS -j oe7. export OMP_NUM_THREADS=28. export KMP_AFFINITY=disabled9. cd ${PBS_O_WORKDIR}10. mpiexec_mpt omplace -nt ${OMP_NUM_THREADS} ./a.out

3行目:利用するCPU数(並列度)とMPIプロセス数を指定。

7行目:各ノードのOpenMP並列ジョブの並列度を指定する環境変数。

csh系の場合は“setenv OMP_NUM_THREADS 2”の様に入力してください。

この変数は必ず設定を行うようにお願いします。

10行目:ハイブリッド並列ジョブを実行するにはmpiexec_mptコマンドとomplaceコマンドを利用します。

各ノードのOpenMPの並列度はomplaceコマンドの-ntオプションの後に指定しください。

Page 39: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 39

コンパイルオプション

Page 40: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

40Confidential ©2017 SGI

– インテルコンパイラのコンパイルコマンド

– icc (C/C++)

– icpc (C++)

– ifort (Fortran)

– オプション一覧を表示

– icc –help

– icc –help [category]

– Categoryを設定することにより必要な情報のみを抽出

– バージョン情報

– icc –V

– コンパイル

– icc [options] file1.c [file2.c …]

コンパイラコマンド

Page 41: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

41Confidential ©2017 SGI

– シリアルプログラム

$ icc –O3 prog.c (コンパイル)

$ dplace ./a.out (実行)

– OpenMPプログラム

$ icc –O3 –qopenmp prog_omp.c (コンパイル)

$ setenv KMP_AFFINITY disabled

$ setenv OMP_NUM_THREADS 4 (スレッド並列数の設定)

$ dplace ./a.out (実行)

– MPIプログラム

$ icc –O3 prog_mpi.c –lmpi (コンパイル)

$ mpiexec_mpt –np 4 dplace –s1 ./a.out (実行)

– ハイブリッド(MPI+OpenMP)プログラム

$ icc –O3 –qopenmp prog_hyb.c –lmpi (コンパイル)

$ setenv KMP_AFFINITY disabled

$ setenv OMP_NUM_THREADS 4 (スレッド並列数の設定)

$ mpiexec_mpt –np 4 omplace –nt ${OMP_NUM_THREADS} ./a.out (実行)

※MPIのオプション-lmpiは最後に付加するようにしてください。

コンパイルと実行 – C/C++プログラム

Page 42: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

42Confidential ©2017 SGI

– デフォルトで設定されている主なオプション

– 推奨するオプション

推奨するコンパイラオプション

オプションの種類 オプション 説明

最適化レベル -O2 パフォーマンス向上のための最適化を行ないます。

特定のプロセッサ向けの最適化 -msse2 インテルプロセッサ向けにSSE2およびSSE命令を生成し、SSE2対応のインテルXeonプロセッサ向けの最適化をします。

オプションの種類 オプション 説明

最適化レベル -O3 -O2に加えプリフェッチ、スカラー置換、ループ変換、およびメモリアクセス変換などのより強力な最適を有効にします。

特定のプロセッサ向けの最適化 -xCORE-AVX2 AVX2, AVX, SSE4.2, SSE4.1, SSSE3, SSE3, SSE2, SSE命令を生成し、AVX2命令をサポートするインテルXeonプロセッサーE5 v3ファミリー向けに最適化をします。

Page 43: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

43Confidential ©2017 SGI

オプション 内容

-O0 全ての最適化を無効とします。主にデバッグ時に利用。

-O1

•グローバルな最適化を有効化

•組み込み関数の認識と組込み関数のインライン展開の無効

この最適化レベルでは、分岐が多く、実行時間の多くがループではないコードの性能向上が見込めます。

-O2

デフォルトの最適化レベル。最適化レベルを指定しない場合、この最適化レベルが適用されます。この最適化レベルでは次の最適化を行います。

• 組み込み関数のインライン展開

• イントラファイルのプロシージャー間の最適化

• インライン展開、定数の伝播、前方代入、ルーチン属性の伝播、変数アドレスの解析など

• パフォーマンスの向上のための機能

• ループアンロール、不要コードの削除、スペキュレーションコントロール、例外処理の最適化など

-O3

-O2オプションに加えて、融合、アンロールとジャムのブロック、IF文の折りたたみなど、より強力なループ変換などの最適化を行います。

浮動小数点演算の多いループや大きなデータセットを処理するコードで性能向上が見込めます。

-axCORE-AVX2または-xCORE-AVX2オプションとの組み合わせでより詳細なデータ依存性解析をします。

-fast-ipo, -O3, -no-prec-div, -static, -fp-model fast=2, -xHOSTを有効にするマクロオプションです。※-fastオプションには-staticオプションが含まれるため、ダイナミック・ライブラリしか提供されていないライブラリを利用する場合、-Bdynamicオプションでそのライブラリを指定する必要があります。

最適化レベルオプション

Page 44: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

44Confidential ©2017 SGI

最適化に関するオプション

オプション 内容

-xプロセッサ プロセッサで指定した特定のプロセッサ向けのバイナリを生成します。

-axプロセッサプロセッサで指定した特定のプロセッサ向けのバイナリと一般的なIA32アーキテクチャ向けのバイナリを一つのバイナリで生成します。

-vec ベクトル化を有効/無効にします。デフォルトは有効。

-no-prec-div IEEE準拠の除算よりも多少精度が低くなる場合がありますが、最適化を試みます。

-no-prec-sqrt 平方根計算が多少精度が低くなる場合はありますが、高速な計算を行います。

Page 45: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

45Confidential ©2017 SGI

– -axプロセッサ、-xプロセッサ

特定のプロセッサ向けの最適化を行います。

特定のプロセッサ向けの最適化オプション

プロセッサ 特定のプロセッサ向けの最適化を行います。

HOSTコンパイルをしたプロセッサで利用可能な、最も高いレベルの命令を生成し、そのプロセッサ向けの最適化を行います。

CORE-AVX2AVX2, AVX, SSE4.2, SSE4.1, SSSE3, SSE3, SSE2, SSE命令を生成し、AVX2命令をサポートするインテルXeonプロセッサーE5 v3ファミリー向けに最適化をします。

SSE4.2Westmere-EX(Intel Xeon E7-8800番台)向けの最適化を行い、SSE4.2命令を生成します。さらに、SSE4のベクトル化コンパイル命令、メディア・アクセラレター、SSSE3, SSE3, SSE2, SSE命令を生成し、インテルCoreプロセッサ向け最適化を行います。

Page 46: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

46Confidential ©2017 SGI

– プロシージャ間解析の最適化

最適化に関するオプション

オプション 内容

-ip 1つのソースファイルにあるプロシージャ間の解析、最適化を行います。

-ipo 複数のソースファイルにあるプロシージャ間の解析、最適化を行います。リンク時にもオプションとして指定してください。

Page 47: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

47Confidential ©2017 SGI

– 浮動小数点演算に関するオプション

最適化に関するオプション

オプション 内容

-ftz アンダーフローが発生したときに値をゼロに置き換えます。

デフォルトでは、最適化レベルが-O1, -O2, -O3のとき、このオプションが有効になっています。最適化レベルが-O0のとき、このオプションは無効になっています。

このオプションが数値動作で好ましくない結果を出力した場合、-no-ftzオプションでアンダーフローが発生したときに値をゼロにフラッシュしなくなります。

-fltconsistency 浮動小数点の一貫性を向上させ、IEEE754規格に則った浮動小数点演算コードを生成します。

-fp-model keyword 浮動小数点演算のセマンティクスを制御します。Keyword

precise: 浮動小数点データの精度に影響する最適化を無効にします。

fast[=1|2]: 浮動小数点データにより強力な最適化を有効にします。

strict: preciseとexceptを有効にし、縮約を無効にし、pragma stdc fenv_accessを有効にします。

source: 中間結果をソースで定義された精度まで丸めます。

double: 中間結果を53ビット(double)精度まで丸めます。

extended: 中間結果を64ビット(extended)精度まで丸めます。

[no-]except: 厳密な浮動小数点例外セマンティクスを使用するか同化を決定します。

Page 48: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

48Confidential ©2017 SGI

最適化に関するオプション

オプション 内容

-falias(ディフォルト)

-fno-alias

-ffnalias(デフォルト)

-fno-fnalias

複数のポインタが同じメモリ領域を参照する (エイリアスがある) かどうかを、コンパイラに指示します。エイリアスがない場合、データ依存性問題の発生する可能性がないため、コンパイラは積極的な最適化を行うようになります。特に C/C++ コードの最適化に効果を発揮します。ソースコードを書き換えてよいなら、ポインタに __restrict を使用することもできます(お勧め)。

エイリアスがある場合、このオプションを使うと正しい結果が得られません。エイリアスがないことを利用者が認識している場合にのみ有効です。

p のアクセス範囲

q のアクセス範囲

エイリアスなし

p

q

p のアクセス範囲

q のアクセス範囲

エイリアスあり

p

q

Page 49: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

49Confidential ©2017 SGI

最適化レポート

オプション 内容

-qopt-report [=n] オブジェクトごとの最適化レポートを生成します。nを0から5の値で詳細レベルを設定することができます。0はレポートを生成しません。詳細レベルは-qopt-report-phaseで設定した最適化フェーズによって異なります。詳細はインテルコンパイラ ユーザー・リファレンスガイドの-qopt-report-phaseを参照。

-qopt-report-file=name 最適化レポートをnameというファイルに出力します。nameにstdoutやstderrを指定すると、それぞれ標準出力や標準エラー出力に出力します。

-qopt-report-routine=name nameで指定されたサブルーチンのレポートのみを出力

-qopt-report-phase=name nameで指定された最適化フェーズのレポートを出力

-qopt-report-help 最適化レポート生成可能な最適化機構フェーズを表示

最適化フェーズ 最適化の内容

cg コード生成フェーズ

ipo プロシージャー間の最適化(IPO)フェーズ

loop ループの入れ子構造の最適化フェーズ

openmp OpenMPフェーズ

※最適化のフェーズについて

最適化フェーズ 最適化の内容

pgo プロファイルに基づく最適化(PGO)フェーズ

tcollect トレース収集フェーズ

vec ベクトル化フェーズ

all すべての最適化フェーズ。Nameを指定しない場合のデフォルト設定。

Page 50: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

50Confidential ©2017 SGI

オプション 内容

-static スタティックライブラリをリンクします。スタティックライブラリが無い場合はエラーになります。

-Bstatic スタティックライブラリを指定します。

-Bdynamic ダイナミックライブラリを指定します。

-shared-intel インテルのダイナミックライブラリをリンクします。

-static-intel インテルのスタティックライブラリをリンクします。

リンクに関するオプション

Page 51: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

51Confidential ©2017 SGI

– Intel® Compilerでは、32および64ビットのバイナリは異なります。

– Intel®64メモリモデル

– small(デフォルト)コードとデータは最初の2GBのメモリ空間に制限されます。

– medium(-mcmodel=medium)コードは最初の2GBのメモリ空間に制限されますが、データは制限されません。

– large(-mcmodel=large)コードもデータも制限されません。

– -mcmodel=medium または -mcmodel=large を指定した場合、-shared-intel オプションも設定してください。

– Intel®64アーキテクチャの2GBの制限は、2GBを超える配列だけでなく、合計が2GBを超える共通ブロックとローカルデータにも適用されます。

Intel®64におけるメモリモデル

Page 52: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 52

数値計算ライブラリ

Page 53: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

53Confidential ©2017 SGI

– 特長

– 科学技術計算向け

– インテルプロセッサ向けにチューニング

– マルチコア対応

–スレッド並列化

–スレッドセーフ

– 自動ランタイム・プロセッサ検出機能

–CおよびFortranのインターフェイス

Intel Math Kernel Library (MKL)

Page 54: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

54Confidential ©2017 SGI

– Intel Math Kernel Libraryは、以下の関数が含まれます。

– BLAS

– BLACS

– LAPACK

– ScaLAPACK

– PBLAS

– Sparse Solver

– Vector Math Library (VML)

– Vector Statistical Library (VSL)

– Conventional DFTs and Cluster DFTs

など

Intel Math Kernel Library (MKL)

詳細はIntel Math Kernel Library User’s GuideおよびReference Manualをご参照ください。

Page 55: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

55Confidential ©2017 SGI

–MKLをリンクする方法

Intel Math Kernel Library (MKL)

シリアル版の場合:$ icc $CFLAGS –o test test.c –lmkl_intel_lp64 –lmkl_sequential –lmkl_core

スレッド版の場合:$ icc $CFLAGS –o test test.c –lmkl_intel_lp64 –lmkl_intel_thread –lmkl_core –liomp5

シリアル版の場合:$ icc $CFLAGS –o test test.c –mkl=sequential

スレッド版の場合:$ icc $CFLAGS –o test test.c –mkl=parallel

また、以下のようにインテルコンパイラの-mklオプションを用いてリンクすることも可能です。

Page 56: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

56Confidential ©2017 SGI

–BLACSおよびScaLAPACKを利用する場合

Intel Math Kernel Library (MKL)

シリアル版の場合:$ icc -lmkl_scalapack_lp64 -lmkl_blacs_sgimpt_lp64 ¥

-lmkl_intel_lp64 -lmkl_sequential -lmkl_core –lmpi example1.c -lmpi

スレッド版の場合:$ icc -lmkl_scalapack_lp64 -lmkl_blacs_sgimpt_lp64 ¥

-lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 example1.c -lmpi

シリアル版の場合:$ icc -lmkl_scalapack_lp64 -lmkl_blacs_sgimpt_lp64 ¥

-mkl=sequential example1.c -lmpi

スレッド版の場合:$ icc -lmkl_scalapack_lp64 -lmkl_blacs_sgimpt_lp64 ¥

-mkl=parallel example1.c -lmpi

インテルコンパイラの-mklオプションを用いた場合

SGI MPT

Intel MPIを利用する場合は、コンパイルコマンドおよびBLACSライブラリのオプションが異なります。※MPIのオプション-lmpiは最後に付加するようにしてください。

Page 57: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

57Confidential ©2017 SGI

–MKLのスレッド版をリンクした場合、以下の設定が必要です。

Intel Math Kernel Library (MKL)

シリアルで実行 環境変数OMP_NUM_THREADSを1に設定します。

スレッド並列で実行

環境変数OMP_NUM_THREADSを並列実行数に設定します。OpenMPのプログラム中でMKLを使う場合、OMP_NUM_THREADSで設定されたスレッド数で実行されます。また、OpenMPのスレッド数とは違うスレッド数で実行したい場合はOMP_NUM_THREADS以外にMKL_NUM_THREADSを設定します。※OpenMPで並列化されたループ内でMKLのスレッド並列化された関数を用いる場合、デフォルトではOpenMPのネストが無効になっているため、MKLのスレッド並列は無効です。環境変数OMP_NESTEDを”yes”とすることにより、MKLのスレッド並列を有効にすることが可能です。

MPIで実行MPIのみで並列実行する場合、MKLがスレッド並列で動作しないように環境変数OMP_NUM_THREADSを1に設定します。

ハイブリッドで実行MPIとスレッド並列のハイブリッドでの実行をする場合、MKLのスレッド数をOMP_NUM_THREADSまたはMKL_NUM_THREADSで設定します。

Page 58: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 58

ファーストタッチとデータ配置

Page 59: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

59Confidential ©2017 SGI

– SGI Altix UV3000 はNUMAアーキテクチャであり、データはファーストタッチ・ポリシーでメモリに配置されます。

– ファーストタッチ・ポリシーとは、最初にデータに触れたコアのローカルメモリにデータが配置されます。

– NUMAアーキテクチャでは、ある特定のコアからみるとローカルメモリとリモートメモリがあります。

– データをできるだけローカルメモリに配置して計算することが高速化において必要です。

– プロセスをどこのコアに配置するかが重要になります。(dplace/omplaceコマンド)

ファーストタッチ・ポリシー

NUMAlinkRouter

128GB128GB

CPU CPU

HUB

UV Blade

128GB128GB

CPU CPU

HUB

UV Blade

128GB128GB

CPU CPU

HUB

UV Blade

128GB128GB

CPU CPU

HUB

UV Blade

ローカルメモリアクセス

リモートメモリアクセス

UVにおける、ファーストタッチ・ポリシーの概念図

Page 60: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

60Confidential ©2017 SGI

– 全てのデータは「ファーストタッチ」で(ページ単位で)メモリに配置されます。

– 初期化ループが逐次実行領域である場合、該当データは逐次実行したノードに配置されます。

– 並列実行領域では全てのプロセッサから1ノードへのアクセスが集中してプログラムの性能が低下します。

NUMAにおける並列化の留意点

for( i=0; i<N; ++i){a[i]=0.0;b[i]=(double)i/2.0;c[i]=(double)i/3.0;d[i]=(double)i/7.0;

}#pragma omp parallel for

for( i=0; i<N; ++i){a[i] = b[i] + c[i] + d[i];

}

NUMAlinkRouter

128GB128GB

CPU CPU

HUB

UV Blade

128GB128GB

CPU CPU

HUB

UV Blade

ここにアクセスが集中してボトルネックにな

並列実行

逐次実行

データがここだけにアロケーションされる

Page 61: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

61Confidential ©2017 SGI

– 初期化ループを並列化します

– 全てのデータは「ファーストタッチ」によりローカルなメモリに配置されます

– 並列実行領域では、各スレッドがローカルなメモリへアクセスすることになり、プログラムの性能が向上する。

NUMAにおける並列化の留意点

#pragma omp parallel for shared(a, b, ,c, d)

for( i=0; i<N; ++i){a[i]=0.0;b[i]=(double)i/2.0;c[i]=(double)i/3.0;d[i]=(double)i/7.0;

}#pragma omp parallel for shared(a, b, c, d)

for( i=0; i<N; ++i){a[i] = b[i] + c[i] + d[i];

}

NUMAlinkRouter

128GB128GB

CPU CPU

HUB

UV Blade

128GB128GB

CPU CPU

HUB

UV Blade

並列実行

並列実行

それぞれのローカルなメモリにデータがアロケーションされ、

アクセスが分散される

Page 62: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 62

デバッグ

Page 63: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

63Confidential ©2017 SGI

デバッガ (シリアルコード、OpenMPコード)

- gdb – GNU Debugger– システム標準のデバッガ– マルチスレッド対応

(OpenMP, pthread)

(使用例)– コアファイルの解析

% gdb ./a.out core

(gdb)where

(gdb)w

– gdbからのプログラムの実行% gdb ./a.out

(gdb) run

– 実行中のプロセスへのアタッチ% gdb a.out [process id]

Page 64: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

64Confidential ©2017 SGI

–MPIプログラムでは、環境変数MPI_SLAVE_DEBUG_ATTACH を設定することで、設定したランクのプロセスが20秒間スリープします

–スリープさせたいランク番号をセットして実行$ setenv MPI_SLAVE_DEBUG_ATTACH 0 (ランク0に設定)

$ mpirun -np 4 ./a.out

MPI rank 0 sleeping for 20 seconds while you attach the debugger.

You can use this debugger command:

gdb /proc/26071/exe 26071

or

idb -pid 26071 /proc/26071/exe

–別のシェルからデバッガでアタッチ– $ gdb /proc/26071/exe 26071

– (gdb) cont

デバッガ(MPIコード)

Page 65: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 65

実習:コンパイル・実行方法

Page 66: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

66Confidential ©2017 SGI

– UV3000へログインします。

– ログインすると、”mpi/PrgEnv-intel_sgi”のモジュールがロードされています。

– この状態でインテルコンパイラ17.1とSGI MPTが設定されています。

– 本日の演習で利用する、ファイル一式をコピーし展開して、作業用ディレクトリを準備します。

UV3000へログイン

$ ssh –l ログイン名 uv

$ module list Currently Loaded Modulefiles:

1) mpi/PrgEnv-intel_sgi

$ cp /work/Samples/Seminar/training_2019_11.tar.gz .$ tar zxvf training_2019_11.tar.gz$ cd training_2019_11$ ls

Page 67: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

67Confidential ©2017 SGI

– 本日の演習では、インタラクティブモードで作業しますので、一人4ソケット (24コア)をqsubコマンドで確保します。

– 以下のメッセージが出て、UV3000にログインし、4ソケット(24コア)が確保されています。

– この状態では、ホームディレクトリにいますので、qsubコマンドを入力したディレクトリに移動します。

インタラクティブジョブ

$ qsub –I –q TINY –l select=1:ncpus=24

qsub: waiting for job 4248.altix-uv to startqsub: job 4248.altix-uv ready

$ cd ${PBS_O_WORKDIR}

Page 68: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

68Confidential ©2017 SGI

本講習会では姫野ベンチマークコードのC言語版を用いて実習を行います。

姫野ベンチマークコードは、理化学研究所の姫野龍太郎氏が非圧縮流体解析コードの性能評価のために開発したもので、ポアソン方程式をヤコビの反復法で解く場合の主要なループの性能を測定するものです。測定結果は、MFLOPSで出力されます。

FLOPSとは、単位時間に実行できる浮動小数点演算の回数です。FLOPS値が高いと浮動小数点演算性能が高いことを示します。

テストコード

理化学研究所 情報基盤センター 姫野ベンチマーク(http://accc.riken.jp/supercom/himenobmt/)

Page 69: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

69Confidential ©2017 SGI

シリアルコード(姫野ベンチマークコード スタティック アロケーション C言語版)をコンパイルします。次のコマンドでコンパイルします。(“-DLARGE”により、Grid-sizeをLに指定します。)

次のコマンドで実行します。

実行結果は以下の値を確認します。

シリアルジョブのコンパイル

$ icc –o himeno.serial –DLARGE himenoBMTxps.c

$ dplace ./himeno.serial

Loop executed for 348 timesGosa : 7.323683e-04MFLOPS measured : 6903.578631 cpu : 56.392519Score based on Pentium III 600MHz : 84.189983

MFLOPS値を確認

Page 70: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

70Confidential ©2017 SGI

次のコンパイラオプションに最適化レベルO3とIntel Xeon E5 v3(Haswell)向けオプション(-xCORE-AVX2)を付けて性能が変わるかを見てみましょう。

まず、最適化レベルO3のみを付けてコンパイル。

つぎにIntel Xeon E5 v3(Haswell)向けオプション(-xCORE-AVX2)を追加してコンパイル。

実行コマンドは前頁と共通です。実行後の性能(MFLOPS値)を確認してみましょう。

シリアルジョブのコンパイル

$ icc –o himeno.serial –DLARGE –O3 himenoBMTxps.c

$ icc –o himeno.serial –DLARGE –O3 –xCORE-AVX2 himenoBMTxps.c

Page 71: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Confidential 71

実習: 自動並列化・OpenMP

Page 72: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

72Confidential ©2017 SGI

– 自動並列化

– 概要

– コンパイルオプション

– コンパイルと実行

– 性能測定

– OpenMPによる並列化

– 概要

– OpenMP指示行

– コンパイルオプション

– 指示行の挿入

– コンパイルと実行

– 性能測定

手順

Page 73: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

73Confidential ©2017 SGI

– インテルコンパイラによる自動並列化

– マルチスレッドの並列化

– コンパイラにより最適化と組み合わせた並列化

– コンパイルオプションによる簡単な操作

– 並列化診断メッセージによるレポート

(ソースコードは出力されません)

自動並列化 概要

Page 74: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

74Confidential ©2017 SGI

-parallel

自動並列化機能を有効にし、安全に並列化できるループのマルチスレッド・コード生成をコンパイラに指示します。このオプションは-O2または-O3オプションも指定する必要があります。

-par-thresholdn

並列実行が効果的である可能性に基づいてループの自動並列化の閾値を設定します。n=0: ループの計算量に関わらず、常に自動並列化します。

n=100: 性能向上が見込める場合のみ自動並列化します。

n=1~99は速度向上する可能性を表します。

-qopt-report=n

–qopt-report-phase=par

–qopt-report-file=stdout

自動並列化の診断情報を制御します。デフォルトでは自動並列化メッセージは出力されません。n=1: 並列化されたループを出力します

n=2:レベル1に加えて、並列化されなかったループとその簡単な理由を出力します。

n=3:レベル2に加えて、private,、shared、reductionとして分類されているメモリ位置を出力します。

n=4:レベル3と同じです。

n=5: レベル4に加えて、並列化を妨げている依存関係を出力します。

自動並列化 コンパイルオプション

Page 75: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

75Confidential ©2017 SGI

シリアルコード(姫野ベンチマークコード スタティック アロケーション C言語版)を自動並列化オプションを付けてコンパイルします。

-qopt-report=1 –qopt-report-phase=par –qopt-report-file=stdoutで自動並列化されたループの情報が以下の様に得られます。

コンパイル

$ icc -o himeno.par -parallel -DLARGE himenoBMTxps.c -qopt-report=1 -qopt-report-phase=par -qopt-report-file=stdout

Begin optimization report for: jacobi(int)

Report from: Auto-parallelization optimizations [par]

LOOP BEGIN at himenoBMTxps.c(195,3)remark #25460: No loop optimizations reportedLOOP BEGIN at himenoBMTxps.c(198,5)

remark #17109: LOOP WAS AUTO-PARALLELIZEDLOOP BEGIN at himenoBMTxps.c(199,7)

remark #25460: No loop optimizations reported

Page 76: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

76Confidential ©2017 SGI

自動並列化された箇所をソースコードで見ると以下のところです。

自動並列化された箇所

189 float190 jacobi(int nn)191 {192 int i,j,k,n;193 float gosa, s0, ss;194195 for(n=0 ; n<nn ; ++n){196 gosa = 0.0;197198 for(i=1 ; i<imax-1 ; i++)199 for(j=1 ; j<jmax-1 ; j++)200 for(k=1 ; k<kmax-1 ; k++){201 s0 = a[0][i][j][k] * p[i+1][j ][k ]202 + a[1][i][j][k] * p[i ][j+1][k ]203 + a[2][i][j][k] * p[i ][j ][k+1]204 + b[0][i][j][k] * ( p[i+1][j+1][k ] - p[i+1][j-1][k ]

このループが並列化されました

LOOP BEGIN at himenoBMTxps.c(198,5)

remark #17109: LOOP WAS AUTO-PARALLELIZED

Page 77: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

77Confidential ©2017 SGI

環境変数OMP_NUM_THREADSでスレッド数を設定して実行します。(KMP_AFFINITY=disabledも忘れずに。)

以下の様に実行結果が得られます。(6スレッド実行結果)

自動並列化 実行

$ setenv OMP_NUM_THREADS 6$ setenv KMP_AFFINITY disabled$ dplace ./himeno.par

Loop executed for 871 timesGosa : 6.077909e-04MFLOPS measured : 16907.951967 cpu : 57.629344Score based on Pentium III 600MHz : 206.194536

Page 78: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

78Confidential ©2017 SGI

– スレッド数を1, 2, 4, 6, 12, 24と変えて、性能を比較してみましょう。

自動並列化 性能評価

スレッド数 性能値 [MFLOPS]

1

2

4

6

12

24

Page 79: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

79Confidential ©2017 SGI

OpenMP指示行による並列化

OpenMP 概要

#pragma omp parallel for shared(A, B, C)for ( i= 1 ; i < 10000 ; i++) {

A[i] = B[i] + C[i-1] + C[i+1]}

代表的なOpenMP指示行・PARALLEL { ……}

・PARALLEL FOR, PARALLEL FOR REDUCTION(+: …)

・MASTER

・CRITICAL

・BARRIER

Page 80: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

80Confidential ©2017 SGI

#include <stdio.h>int main(void)

{#pragma omp parallel{

#pragma omp criticalprintf(“hello, world¥n”) ;

}}

並列実行領域

“hello, world”

–PARALLEL 指示行#pragma omp parallel [オプション (節)]

–指示行に続く文を並列に実行します。

Page 81: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

81Confidential ©2017 SGI

$ icc -qopenmp -qopt-report=1 -qopt-report-phase=openmp -qopt-report-file=stdout hello.c

Intel(R) Advisor can now assist with vectorization and show optimization

report messages with your source code.

See "https://software.intel.com/en-us/intel-advisor-xe" for details.

Begin optimization report for: main(void)

Report from: OpenMP optimizations [openmp]

hello.c(5:3-5:3):OMP:main: OpenMP DEFINED REGION WAS PARALLELIZED

===========================================================================$

$ setenv OMP_NUM_THREADS 4

$ setenv KMP_AFFINITY disabled

$ dplace ./a.out

hello, world

hello, world

hello, world

hello, world

$

hello, world の実行例

マスタスレッドのみ実行

並列実行領域の生成

それぞれ write文を実行

待ち合わせ

マスタスレッドのみの実行に戻る

実行開始

終了

Page 82: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

82Confidential ©2017 SGI

・for指示行#pragma omp for [オプション (節)]

– 並列実行領域で使用し、後続する forループを各スレッドで分担

して実行します。

– デフォルトでは、ループ長がスレッド数で均等に分割されます。

forループのワークシェアリング

ループ長 N の処理

i=1,2,… N N/4 ずつに分割

スレッド

スレッド

スレッド

スレッド3

4 スレッドの場合

Page 83: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

83Confidential ©2017 SGI

void daxpy(int n, double c, double *x, double *y){

int i;#pragma omp parallel for private(i) shared(c,x,y)for(i = 0 ; i < n ; i++) {

y[i] = y[i] + c * x[i];}

}

for ループのワークシェアリング

–parallel for 指示文– parallel 指示文 + for 指示文

– 並列実行領域を作成し、後続の for ループを分割実行します。

Page 84: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

84Confidential ©2017 SGI

– 並列実行領域や分割実行されるループ中で参照される変数に関して、それらが、

– 各スレッドごとに独立した変数とすべきか、

– すべてのスレッドで共有される変数とすべきか、

を宣言する必要があります。

これらを「データスコープ属性」と言います。

– データスコープ属性は、parallel 指示文や for 指示文の「オプション」として指定します。これらの「オプション」を、OpenMP では 「節 (clause)」と呼びます。

#pragma omp parallel for private(i) shared(n, c, x, y)

データスコープ属性

shared 節private 節

Page 85: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

85Confidential ©2017 SGI

–shared 変数

– shared 節に指定された変数に対しては、すべてのスレッドから同一のオブジェクトが参照されます。

– オブジェクトの内容は、マスタスレッドが保持していたものと同一です。

shared 変数と private 変数

n c x y iマスタスレッド

shared 変数は、すべてのスレッドが同一の実体を参照します。

shared(n, c, x, y)

Page 86: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

86Confidential ©2017 SGI

–private 変数

– private 節に指定された変数は、それぞれのスレッドに独立なオブジェクトが生成されます。

– private 変数の内容は、元のマスタスレッドの変数の内容とは無関係です。

shared 変数と private 変数

n c x y iマスタスレッド

private 変数は、各スレッドごとに独立した実体を参照します。

private(i)

iiii

Page 87: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

87Confidential ©2017 SGI

そのままでは並列化できないループ

縮約演算(reduction演算)

for( i=1 ; i<10000 ; i++ ){S = S + A[i]

}

for( i=1 ; i<5000 ; i++ ){S = S + A[i]

}

0

∵変数Sが、グローバルな属性ならば、スレッド0と1が次々と勝手にSの値を書き換えるため、不正な結果となる

for( i=5000 ; i<10000 ; i++ ){S = S + A[i]

}

1

Sを各スレッドにローカルな変数にすると部分和は求めることができるが、全体の和は?

Page 88: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

88Confidential ©2017 SGI

そのままでは並列化できないループ

縮約演算(reduction演算)

#paragma omp parallel for reduction(+: S)for( i=1 ; i<10000 ; i++ ){

S = S + A[i]}

for( i=1 ; i< 5000 ; i++ ){S0 = S0 + A[i]

}

0

(注)reduction演算の結果は、逐次演算の結果と異なる場合があります。これは、演算の順序が異なり丸め誤差が生じる可能性があるためです。並列度数を変更しても結果が異なる場合があります。

for( i=5000 ; i<10000 ; i++ ){S1 = S1+ A[i]

}

1

S = S + S0+ S1

Page 89: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

89Confidential ©2017 SGI

・reduction節

– 配列を何らかの演算によってひとつのスカラー変数に縮約する操作を「reduction演算」、その変数を「reduction変数」と言います。

– reduction節は次のような書式です。

#pragma omp for reduction(op : var)

var はreduction変数 (のカンマ区切りリスト)op の演算子は、 +, *, -, .AND. , .OR. , .EQV. , .NEQV. ,または、組み込み関数 MAX, MIN, IAND, IOR, IEORのいずれか。

– reduction変数var は、ループ実行中に private 変数として扱われ、終了後に各スレッドの値を元の変数に縮約します。 var は、実行するreduction演算の種類に応じて次のように適切に初期化されます。

– op = +、- の時 : 初期値 0

– op = * の時 : 初期値 1

– op = MAX の時: 初期値は与えられたデータ型で負の絶対値最大の値

– op = MIN の時: 初期値は与えられたデータ型で正の絶対値最大の値

縮約演算(reduction演算)

Page 90: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

90Confidential ©2017 SGI

-qopenmp OpenMP指示行に基づきマルチスレッド・コードを生成します。

-qopt-report=n

-qopt-report-phase=openmp

-qopt-report-file=stdout

OpenMPの診断情報を制御します。

デフォルトではOpenMPの診断メッセージは出力されません。n=1: 正常に並列化されたループ、領域、セクション、タスクを出力します。

n=2: レベル1に加えて、正常に処理されたmaster構造、single構造、critical構造、ordered構造、atomicプラグ間などのメッセージを出力します。

OpenMP コンパイラオプション

Page 91: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

91Confidential ©2017 SGI

姫野ベンチマーク(スタティック アロケーション C言語版)のコードで一番処理が重いのは以下のjacobi関数の198行目のループです。

OpenMP指示行の挿入

189 float190 jacobi(int nn)191 {192 int i,j,k,n;193 float gosa, s0, ss;194195 for(n=0 ; n<nn ; ++n){196 gosa = 0.0;197198 for(i=1 ; i<imax-1 ; i++)199 for(j=1 ; j<jmax-1 ; j++)200 for(k=1 ; k<kmax-1 ; k++){201 s0 = a[0][i][j][k] * p[i+1][j ][k ]202 + a[1][i][j][k] * p[i ][j+1][k ]203 + a[2][i][j][k] * p[i ][j ][k+1]204 + b[0][i][j][k] * ( p[i+1][j+1][k ] - p[i+1][j-1][k ]205 - p[i-1][j+1][k ] + p[i-1][j-1][k ] )206 + b[1][i][j][k] * ( p[i ][j+1][k+1] - p[i ][j-1][k+1]207 - p[i ][j+1][k-1] + p[i ][j-1][k-1] )208 + b[2][i][j][k] * ( p[i+1][j ][k+1] - p[i-1][j ][k+1]209 - p[i+1][j ][k-1] + p[i-1][j ][k-1] )

210 + c[0][i][j][k] * p[i-1][j ][k ]211 + c[1][i][j][k] * p[i ][j-1][k ]212 + c[2][i][j][k] * p[i ][j ][k-1]213 + wrk1[i][j][k];214215 ss = ( s0 * a[3][i][j][k] - p[i][j][k] ) * bnd[i][j][k];216217 gosa+= ss*ss;218 /* gosa= (gosa > ss*ss) ? a : b; */219220 wrk2[i][j][k] = p[i][j][k] + omega * ss;221 }222223 for(i=1 ; i<imax-1 ; ++i)224 for(j=1 ; j<jmax-1 ; ++j)225 for(k=1 ; k<kmax-1 ; ++k)226 p[i][j][k] = wrk2[i][j][k];227228 } /* end n loop */229230 return(gosa);231 }

Page 92: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

92Confidential ©2017 SGI

198行目のループに指示行を挿入して並列化します。

– #pragma omp parallel forを挿入

– private変数の設定をする(デフォルトはshared属性なのでshared節は書かなくてもよい)

– 変数gosaは、ssの総和計算をしているのでreduction節を用いる

OpenMP指示行の挿入

189 float190 jacobi(int nn)191 {192 int i,j,k,n;193 float gosa, s0, ss;194195 for(n=0 ; n<nn ; ++n){196 gosa = 0.0;197

#pragma omp parallel for reduction(+:gosa) private(i, j, k, s0, ss)198 for(i=1 ; i<imax-1 ; i++)199 for(j=1 ; j<jmax-1 ; j++)200 for(k=1 ; k<kmax-1 ; k++){201 s0 = a[0][i][j][k] * p[i+1][j ][k ]202 + a[1][i][j][k] * p[i ][j+1][k ]203 + a[2][i][j][k] * p[i ][j ][k+1]204 + b[0][i][j][k] * ( p[i+1][j+1][k ] - p[i+1][j-1][k ]205 - p[i-1][j+1][k ] + p[i-1][j-1][k ] )206 + b[1][i][j][k] * ( p[i ][j+1][k+1] - p[i ][j-1][k+1]207 - p[i ][j+1][k-1] + p[i ][j-1][k-1] )208 + b[2][i][j][k] * ( p[i+1][j ][k+1] - p[i-1][j ][k+1]209 - p[i+1][j ][k-1] + p[i-1][j ][k-1] )

210 + c[0][i][j][k] * p[i-1][j ][k ]211 + c[1][i][j][k] * p[i ][j-1][k ]212 + c[2][i][j][k] * p[i ][j ][k-1]213 + wrk1[i][j][k];214215 ss = ( s0 * a[3][i][j][k] - p[i][j][k] ) * bnd[i][j][k];216217 gosa+= ss*ss;218 /* gosa= (gosa > ss*ss) ? a : b; */219220 wrk2[i][j][k] = p[i][j][k] + omega * ss;221 }222223 for(i=1 ; i<imax-1 ; ++i)224 for(j=1 ; j<jmax-1 ; ++j)225 for(k=1 ; k<kmax-1 ; ++k)226 p[i][j][k] = wrk2[i][j][k];227228 } /* end n loop */229230 return(gosa);231 }

Page 93: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

93Confidential ©2017 SGI

223行目のループも並列化できるので、198行目のループと223行名のループ一つの並列実行領域に含めて、各ループは#pragma omp forでそれぞれ並列化します。

ここまでのコードをhimenoBMTxps_omp01.cとします。

OpenMP指示行の挿入

189 float190 jacobi(int nn)191 {192 int i,j,k,n;193 float gosa, s0, ss;194195 for(n=0 ; n<nn ; ++n){196 gosa = 0.0;197

#pragma omp parallel private(I, j, k, s0, ss){

#pragma omp for reduction(+:gosa)198 for(i=1 ; i<imax-1 ; i++)199 for(j=1 ; j<jmax-1 ; j++)200 for(k=1 ; k<kmax-1 ; k++){201 s0 = a[0][i][j][k] * p[i+1][j ][k ]202 + a[1][i][j][k] * p[i ][j+1][k ]203 + a[2][i][j][k] * p[i ][j ][k+1]204 + b[0][i][j][k] * ( p[i+1][j+1][k ] - p[i+1][j-1][k ]205 - p[i-1][j+1][k ] + p[i-1][j-1][k ] )206 + b[1][i][j][k] * ( p[i ][j+1][k+1] - p[i ][j-1][k+1]207 - p[i ][j+1][k-1] + p[i ][j-1][k-1] )208 + b[2][i][j][k] * ( p[i+1][j ][k+1] - p[i-1][j ][k+1]209 - p[i+1][j ][k-1] + p[i-1][j ][k-1] )

210 + c[0][i][j][k] * p[i-1][j ][k ]211 + c[1][i][j][k] * p[i ][j-1][k ]212 + c[2][i][j][k] * p[i ][j ][k-1]213 + wrk1[i][j][k];214215 ss = ( s0 * a[3][i][j][k] - p[i][j][k] ) * bnd[i][j][k];216217 gosa+= ss*ss;218 /* gosa= (gosa > ss*ss) ? a : b; */219220 wrk2[i][j][k] = p[i][j][k] + omega * ss;221 }222

#pragma omp for223 for(i=1 ; i<imax-1 ; ++i)224 for(j=1 ; j<jmax-1 ; ++j)225 for(k=1 ; k<kmax-1 ; ++k)226 p[i][j][k] = wrk2[i][j][k];

}227228 } /* end n loop */229230 return(gosa);231 }

Page 94: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

94Confidential ©2017 SGI

OpenMPにより並列化したコード(himenoBMTxps_omp01.c)をコンパイルします。

-qopt-report=1 –qopt-report-phase=openmp –qopt-report-file=stdoutでOpenMPにより並列化されたループの情報が以下の様に得られます。

環境変数OMP_NUM_THREADSでスレッド数を設定し実行します。(KMP_AFFINITY=disabledも忘れずに。)

OpenMP コンパイルと実行

$ icc -o himeno.omp01 -qopenmp -DLARGE himenoBMTxps_omp01.c -qopt-report=1 -qopt-report-phase=openmp -qopt-report-file=stdout

Begin optimization report for: jacobi(int)

Report from: OpenMP optimizations [openmp]

himenoBMTxps_omp01.c(198:1-198:1):OMP:jacobi: OpenMP DEFINED REGION WAS PARALLELIZED

$ setenv OMP_NUM_THREADS 6$ setenv KMP_AFFINITY disabled$ dplace ./himeno.omp01

Page 95: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

95Confidential ©2017 SGI

–himenoBMTxps_omp01.cをコンパイル・実行し、スレッド数を1,2,4,6,12, 24と変更し性能を評価してみましょう。

OpenMP 性能評価

スレッド数 性能値 [MFLOPS]

1

2

4

6

12

24

Page 96: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

96Confidential ©2017 SGI

himenoBMTxps_omp01.cでは、処理が重いjacobi関数のみを並列化しました。UV3000はNUMAアーキテクチャなので、データはファーストタッチで配置されるため、配列の初期化の処理がシリアルで行われているので、jacobi関数で使われる配列はすべて一つのソケットに接続されたメモリ配置されています。

複数のソケットを使って並列実行する場合、リモート参照が発生するため、コア数を増やして実行しても性能が伸びません。

そこで、 himenoBMTxps_omp01.cの配列の初期化をしているinitmt関数の部分を並列化します。

さらに、OpenMP指示行の挿入

Page 97: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

97Confidential ©2017 SGI

initmt関数の152行目と170行目のループを並列化します。この変更をしたファイルをhimenoBMTxps_omp02.cとします。

さらに、OpenMP指示行の挿入

147 void148 initmt()149 {150 int i,j,k;151

#pragma omp parallel for private(i,j,k)152 for(i=0 ; i<MIMAX ; i++)153 for(j=0 ; j<MJMAX ; j++)154 for(k=0 ; k<MKMAX ; k++){155 a[0][i][j][k]=0.0;156 a[1][i][j][k]=0.0;157 a[2][i][j][k]=0.0;158 a[3][i][j][k]=0.0;159 b[0][i][j][k]=0.0;160 b[1][i][j][k]=0.0;161 b[2][i][j][k]=0.0;162 c[0][i][j][k]=0.0;163 c[1][i][j][k]=0.0;164 c[2][i][j][k]=0.0;165 p[i][j][k]=0.0;166 wrk1[i][j][k]=0.0;167 bnd[i][j][k]=0.0;168 }169

#pragma omp parallel for private(i,j,k)170 for(i=0 ; i<imax ; i++)171 for(j=0 ; j<jmax ; j++)172 for(k=0 ; k<kmax ; k++){173 a[0][i][j][k]=1.0;174 a[1][i][j][k]=1.0;175 a[2][i][j][k]=1.0;176 a[3][i][j][k]=1.0/6.0;177 b[0][i][j][k]=0.0;178 b[1][i][j][k]=0.0;179 b[2][i][j][k]=0.0;180 c[0][i][j][k]=1.0;181 c[1][i][j][k]=1.0;182 c[2][i][j][k]=1.0;183 p[i][j][k]=(float)(i*i)/(float)((imax-1)*(imax-1));184 wrk1[i][j][k]=0.0;185 bnd[i][j][k]=1.0;186 }187 }

Page 98: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

98Confidential ©2017 SGI

himenoBMTxps_omp02.cをコンパイル・実行し、スレッド数を1,2,4,6,12, 24と変更し性能を評価してみましょう。

himenoBMTxps_omp01.cと比較して性能は変化しましたか?

OpenMP 性能評価

スレッド数 性能値 [MFLOPS]

1

2

4

6

12

24

Page 99: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

99Confidential ©2017 SGI

– 起動

– モード

– Viエディタは、コマンドモードと入力モードがあります。それぞれのモードへの切り替えは以下の操作をします。

– コマンドモード ESCキー

– 入力モード iキー

– 終了方法

– コマンドモードで以下の操作をするを終了することができます。

– ファイルを保存して終了 :wq

– ファイルを保存せず終了 :q!

参考: viエディタの使い方

$ vi ファイル名

Page 100: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

100Confidential ©2017 SGI

参考: viエディタの使い方

操作の分類 コマンド 操作

入力モードへ移行 i カーソルの位置から入力に入る

コマンドモードへ移行 Esc ※ 何度押してもコマンドモードのまま

カーソルの移動

→ ( l ) 右へ移動

← ( h ) 左へ移動

↑ ( k ) 上へ移動

↓ ( j ) 下へ移動

文字の削除x 1文字削除

dd 1行削除(=1行カット)

カット/コピー/ペースト

yy 1行コピー

dd 1行カット

p ペースト

検索

/検索文字列 後方検索

?検索文字列 前方検索

n 次の候補

N 前の候補

保存・終了

:q ! 保存せずに終了

:wq 保存して終了

:zz 保存して終了

:w 上書き保存

Page 101: 北陸先端科学技術大学院大学殿...2019/11/01  · Module名 コンパイラ MPI Intel/16.0.2 Intel parallel_studio_xe_2016 X Intel/17.0.1 Intel parallel_studio_xe_2017 X

Thank you