Microsoft PowerPoint - 02_What is OpenMP 4.0 offload_Jan18

Similar documents
Introduction to OpenMP* 4.0 for SIMD and Affinity Features with Intel® Xeon® Processors and Intel® Xeon Phi™ Coprocessors

Microsoft PowerPoint - 002_OpenMP 5.0_2018_Part2

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

PowerPoint Presentation

Microsoft PowerPoint - OpenMP入門.pptx

Presentation title

02_C-C++_osx.indd

01_OpenMP_osx.indd

OpenMP 3.0 C/C++ 構文の概要

演習1: 演習準備

コードのチューニング

Code Modernization Online training plan

1.overview

Jackson Marusarz 開発製品部門

インテル(R) Visual Fortran コンパイラ 10.0

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

Microsoft Word - openmp-txt.doc

Microsoft PowerPoint - 演習1:並列化と評価.pptx

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

The 3 key challenges in programming for MC

2. OpenMP OpenMP OpenMP OpenMP #pragma#pragma omp #pragma omp parallel #pragma omp single #pragma omp master #pragma omp for #pragma omp critica

NUMAの構成

Slide 1

IntelR Compilers Professional Editions

インテル® Parallel Studio XE 2015 Composer Edition for Linux* インストール・ガイドおよびリリースノート

Microsoft PowerPoint - 1_コンパイラ入門セミナー.ppt

連載講座 : 高生産並列言語を使いこなす (4) ゲーム木探索の並列化 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 準備 問題の定義 αβ 法 16 2 αβ 法の並列化 概要 Young Brothers Wa

目次 1 はじめに 製品に含まれるコンポーネント 動作環境... 4 オペレーティング システム... 4 Microsoft Visual Studio* 製品 製品のダウンロード 製品版をインストールする場合 評価版を

C

hotspot の特定と最適化

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

openmp1_Yaguchi_version_170530

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

スライド 1

PowerPoint プレゼンテーション

Microsoft PowerPoint - KHPCSS pptx

NUMAの構成

Microsoft* Windows* 10 における新しい命令セットの利用

内容 インテル Advisor ベクトル化アドバイザー入門ガイド Version インテル Advisor の利用 ワークフロー... 3 STEP1. 必要条件の設定... 4 STEP2. インテル Advisor の起動... 5 STEP3. プロジェクトの作成

Product Brief 高速なコードを素早く開発 インテル Parallel Studio XE 2017 インテル ソフトウェア開発ツール 概要 高速なコード : 現在および次世代のプロセッサーでスケーリングする優れたアプリケーション パフォーマンスを実現します 迅速に開発 : 高速かつ安定し

インテル® Parallel Studio XE 2013 Linux* 版インストール・ガイドおよびリリースノート

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

ホワイトペーパー インテル Xeon Phi コプロセッサー開発者向けクイック スタート ガイド バージョン 1.7

PowerPoint プレゼンテーション

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

インテル Parallel Studio XE 2017 Composer Edition for Fortran Windows* インストール ガイド Rev (2017/06/08) エクセルソフト株式会社

Class Overview

enshu5_4.key

XACC講習会

N08

目次 はじめに... 4 目的... 4 本ガイドに含まれるトピック :... 4 本ガイドに含まれないトピック :... 4 用語... 4 システム構成... 5 インテル Xeon Phi コプロセッサー向けソフトウェア... 5 インテル メニー インテグレーテッド コア ( インテル MI

PowerPoint Presentation

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

並列計算導入.pptx

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

memo

XcalableMP入門

HPC143

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

Click to edit title

PowerPoint Presentation

インテル® C++ コンパイラー 16.0 Update 1 for Windows* リリースノート (インテル® Parallel Studio XE 2016)

使用する前に

OpenMPプログラミング

Microsoft PowerPoint Quality-sama_Seminar.pptx

OpenMP (1) 1, 12 1 UNIX (FUJITSU GP7000F model 900), 13 1 (COMPAQ GS320) FUJITSU VPP5000/64 1 (a) (b) 1: ( 1(a))

VXPRO R1400® ご提案資料

スパコンに通じる並列プログラミングの基礎

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£²¡Ë

生物情報実験法 (オンライン, 4/20)

スパコンに通じる並列プログラミングの基礎

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows : インストール・ガイド

The Parallel Universe 1 インテル MPI ライブラリーのマルチ EP によりハイブリッド アプリケーションのパフォーマンスを向上 最小限のコード変更でエクサスケール時代に備える Rama Kishan Malladi インテルコーポレーショングラフィックス パフォーマンス モ

ピクセル同期を利用した順不同半透明描画 (更新)

Microsoft PowerPoint - compsys2-06.ppt

Insert your Title here

スライド 1

for (int x = 0; x < X_MAX; x++) { /* これらの 3 つの行は外部ループの自己データと * 合計データの両方にカウントされます */ bar[x * 2] = x * ; bar[(x * 2) - 1] = (x - 1.0) *

Microsoft PowerPoint - VSUGDAY_2008_Intel_V2.ppt

バトルカードでゲーマーやエンスージアストへの販売促進

並列・高速化を実現するための 高速化サービスの概要と事例紹介

OpenMPプログラミング

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

この時お使いの端末の.ssh ディレクトリ配下にある known_hosts ファイルから fx.cc.nagoya-u.ac.jp に関する行を削除して再度ログインを行って下さい

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

インテル® Parallel Studio XE 2019 Composer Edition for Fortran Windows 日本語版 : インストール・ガイド

連載講座 : 高生産並列言語を使いこなす (5) 分子動力学シミュレーション 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 問題の定義 17 2 逐次プログラム 分子 ( 粒子 ) セル 系の状態 ステップ 18

PowerPoint プレゼンテーション

I I / 47

インテル® Parallel Studio XE 2017 Composer Edition for Fortran Windows - インストール・ガイド -

07-二村幸孝・出口大輔.indd

CELSIUSカタログ(2012年7月版)

Prog1_10th

XACCの概要

01-introduction.ppt

Xeon Phi MICROSOFT* WINDOWS* 1.4 1

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

PowerPoint プレゼンテーション

Transcription:

OpenMP* 4.x における拡張 オフロード

内容 デバイス ( アクセラレーター ) 拡張 れ の並列化制御 プロセッサーバインドとアフィニティーの制御 2

内容 デバイス ( アクセラレーター ) 拡張 基本 データ移動 永続性 並 ( 同期 ) 実 インテル コンパイラーのオフロード向け 語拡張 (LEO) OpenMP* 3

内容 デバイス ( アクセラレーター ) 拡張 基本 データ移動 永続性 並 ( 同期 ) 実 インテル コンパイラーのオフロード向け 語拡張 (LEO) OpenMP* 4

オフロード : 他のプロセッサーで実 ホスト上で動作するプログラムは コードの特定のブロックを MIC で実 するため ワークを オフロード する また ホストはホストとデバイス間のデータ転送を指 する ホスト上で実 されるアプリケーション "... ワークを実 し 指 された結果を転送... " デバイス ( 別のプロセッサー ) が割り当てられたワークを実 している間 ホストがアクティブ状態を保つのが理想的 x16 PCIe ワーク ( ホスト ) 平 ワーク (mic) 5

オフロードを制御 MIC を検出 ワーク ( ホスト ) x16 PCIe 平 ワーク (mic) データ転送割り当て / 開放平 性 動オフロードをさらに効率よく うには 修飾 が必要 ( 句 属性 指定 キーワード ) 割り当て / 関連付け MIC メモリー データを MIC へ転送 実 MIC 上のコード MIC からデータを転送 開放 MIC メモリー 単 のオフロード宣 6

基本オフロード同期 ( デバイス選択 データ転送 およびデバイス上のストレージ ) データが構 の範囲内にある場合 変数はデバイスへ / から転送され 領域の入口 / 出口で割り当て / 開放される インテル LEO # pragma offload target(mic:0) { } a=b 領域 7

OpenMP* 4.0 への移 基本操作は同じ シンタックスが異なる インテル LEO OpenMP # pragma offload target(mic:0) # pragma omp target device(0) { { a=b a=b } } 8

データ転送の 向 PCIe バスの帯域幅を抑える #pragma offload target(mic:0) in(b),out(a),inout(c) { } インテル LEO a=b;c=c*c 9

OpenMP* 4.0 への移 OpenMP の動作は同じ シンタックスが異なるだけ インテル LEO OpenMP #pragma offload target(mic:0) #pragma omp target device(0) in(b),out(a),inout(c) map(to:b),map(from:a),map(tofrom:c) { { a=b;c=c*c a=b;c=c*c } } データ転送属性は省略可能 10

サンプルコード Pi を求めるプログラムをインテル コンパイラーのオフロード向け拡張と OpenMP 4.0 の機能を使 して記述 演習と 順

内容 デバイス ( アクセラレーター ) 拡張 基本 データ移動 永続性 並 ( 同期 ) 実 インテル コンパイラーのオフロード向け 語拡張 (LEO) OpenMP* 12

データの永続性 割り当て / 転送 割り当て / 開放 永続性データ転送 実 MIC 上のコード 転送 実 MIC 上のコード 転送 転送 / 開放 13

データの永続性 -- LEO と OpenMP* 4.0 インテル LEO OpenMP 割り当て / 転送 { 新しい永続性マッピングは オフロード宣 を含むどこにでも作成できる 構造化 実 MIC 上のコード 転送 実 MIC 上のコード 転送 新しい永続性マッピングは この領域内で作成できない 構造化 14 転送 / 開放 } *OpenMP の 構造化は OpenMP 4.5 で利 可能

LEO のデータ永続性 構造化転送 : #pragma offload_transfer in/out(vars:alloc_if(logical) free_if(logical)) 真なら割り当て 真なら開放 オフロード宣 でも指定可能 : #pragma offload in/out(vars:alloc_if(logical) free_if(logical) ) 15

OpenMP* のデータ永続性 構造化転送 : #progma target data device(0) map([to from alloc]: vars) {... } デフォルトのマッピングは 変数 vars の "tofrom" 16

OpenMP* 4.0 への移 データの永続性 インテル LEO OpenMP* #pragma offload_transfer target(mic:0)& #pragma omp target data device(0) & in(c:alloc_if(1) free_if(0)) map(c)! デフォルトは tofrom! データは 割り当てられ コピーされ 開放されない! データは 割り当てられ コピーされ 開放されない...... { #pragma offload target(mic:0) nocopy(c) #pragma omp target device(0) a=b;c=c*c;! a & b, 自動 ; c 永続! a & b, 自動 ; a=b;c=c*c;! c 永続...! Offload_transfer は データをデバイスからコピーし開放 #pragma offload_transfer target(mic:0)& out(c:alloc_if(0) free_if(1))... }! データ構造化ブロックの最後! デフォルトは from 17

OpenMP* 4.5 における新しいデータの永続性 非構造化転送 : #progma omp target enter data device(0) map(to alloc: vars) 非構造化転送 : #progma omp target exit data device(0) map(from release delete: vars) delete = 完全に開放 release = 参照カウントを減らす 18

サンプルコード プログラム内に複数のオフロード領域がある場合 デバイス上のデータをどのように継続利 もしくは廃棄するか? オフロードのサンプルコード

内容 デバイス ( アクセラレーター ) 拡張 基本 データ移動 永続性 並 ( 同期 ) 実 インテル コンパイラーのオフロード向け 語拡張 (LEO) OpenMP* 20

同期オフロード 同期実 : ホストのスレッド / プロセスは オフロード構 で完了を待機 同期実 : ホストのスレッド / プロセスは オフロード構 を実 後 すぐに実 を継続し wait で指 される場所で待機 ホスト実行 ホスト実行 時間 オフロード宣言子 MIC でのみ実行 MIC 実行 時間 オフロード ( 非同期 ) ホストと MIC は平行にここを実行 MIC 実行 ホストは wait で待機 オフロード完了ホストはここから実行を続行 21

平 実 -- 簡単 LEO target signal(id) signal 句 同期に う 追加のスレッドは必要なし signal の引数は待機する " プロセス " を特定 wait(id) でプロセスを待機 ( 単独もしくは target 構 ) OpenMP* target nowait インテル コンパイラー 16 (OpenMP 4.5) でサポート nowait 句 同期に う 追加のスレッドが必要 task 識別 なし taskwait を使 22

同時実 LEO ( ホストと MIC -- 簡単 ) #pragma offload target(mic:0) signal(&isig) #pragma omp parallel num_threads(60) work(noff1, nend1)!mic で実行!T1!T0 MIC オフロードが完了するまでホストはポーズ #pragma omp parallel num_threads(16) work(noff2, nend2)! ホストで実行 #pragma offload_wait target(mic:0) wait(&isig)!t2 CPU MIC への新たなワークも開始しない インテルの 同期実装では オフロード後即座にホストのほかの並列領域を実 することを許可 23 時間 ( 秒 ) は ホスト上で計測 Total T0 T1 T2 同期 off 2.11117 1.12804 0.98314 同期 on 1.08984 0.00002 1.01347

同時実 OpenMP* ( ホストと MIC -- 簡単 ) #pragma omp target parallel num_threads(60) nowait work(noff1, nend1)! mic で実行 MIC #pragma omp parallel num_threads(16) work(noff2, nend2)! ホストで実行 CPU #pragma omp taskwait 複合構 に注意 (target と parallel) 24

LEO のまとめ 操作 関数定義 グローバル コード実 領域割り当てデータ転送同時実 attributes/declspec offload 宣 句もしくは修飾 offload_transfer alloc_if free_if in, out, inout, length signal wait 同期 offload_wait データ転送永続性 同期実 s u 25g a t e c h

OpenMP* まとめ 操作 関数定義 グローバル コード実 領域割り当てデータ転送同時実 宣 句もしくは修飾 declare target target target update alloc, release, delete map(to,from,tofrom) length nowait depend 同期 taskwait 26 データ転送永続性 同期実

OpenMP* 4.x への移 OpenMP 4.0 は LEO (Language Extensions for Offload) と同様のデバイス Target 宣 を持っている インテル コンパイラー 15.0 は OpenMP 4.0 に準拠している Update 版は 4.5 のコンポーネントを組み込んでいる OpenMP 4.0 では 明 的な 同期句と 構造化データマッピングがサポートされていない これらは OpenMP 4.5 でサポートされる データの永続性はより簡単になるが 構造化マッピングの制御はさらに必要となる インテル コンパイラー 16.0 は 同期句 (nowait) をサポートしている s u 27g a t e c h

同期オフロードの例 素数を求める計算をホスト (CPU) とデバイス (MIC) で 同期に同時実 する オフロードのサンプルコード

内容 デバイス ( アクセラレーター ) 拡張 基本 データ移動 永続性 並 ( 同期 ) 実 インテル コンパイラーのオフロード向け 語拡張 (LEO) OpenMP* 29

LEO OpenMP 4.x (Fortran) 汎 デバイス実 OFFLOAD TARGET デバイス指 target(mic:#) device(#) デバイスメモリー割り当て 転送 IN( ) OUT( ) INOUT( ) map(to:) map(from:) map(tofrom:) 構造化データ転送 OFFLOAD_TRANSFER UPDATE 同期 SIGNAL(S) NOWAIT* WAIT(S) TASKWAIT 例!dir$ offload begin target(mic:0) in(x) out(y) signal(sync) <mic work>!dir$ end offload <host work>!dir$ offload_wait target(mic:0) wait(sync)!$omp target device(0) map(to:x) map(from:y) nowait <device work>!$omp end target <host work>!$omp taskwait データの永続性!dir$ attributes offload:mic :: x, y!dir$ offload offload_transfer target(mic:0) in(a: alloc/free...) out(b: alloc/free ) nocopy(c: alloc/free ) 更新 :!dir$ offload offload_transfer target(mic:0) in(a: )out(b: )!dir$ offload begin target(mic:0) in(a: )out(b: )!$omp target declare (x, y)!$omp target data device(0) map(to: a) map(from: b) map(alloc: c) グローバル 構造化 *!$omp target update device(0) to(a) from(b)!$omp target device(0) map(always,to: a) map(always,from: b) *nowait は インテル コンパイラー 16 の 4.5 の機能 * 構造化マッピング (target enter/exit data) は OpenMP 4.5 でサポート 30

LEO OpenMP 4.x (C/C++) 汎 デバイス実 OFFLOAD TARGET デバイス指 target(mic:#) device(#) デバイスメモリー割り当て 転送 IN( ) OUT( ) INOUT( ) map(to:) map(from:) map(tofrom:) 構造化データ転送 OFFLOAD_TRANSFER UPDATE 同期 SIGNAL(S) NOWAIT* WAIT(S) TASKWAIT 例 #pragma offload target(mic:0) in(x) out(y) signal(sync) { <mic work> } { <host work> } #pragma offload_wait target(mic:0) wait(sync) #pragma omp target device(0) map(to:x) map(from:y) nowait { <device work> } { <host work> } #pragma omp taskwait データの永続性 #pragma offload_attribute( target(mic)) int x,y #pragma offload offload_transfer target(mic:0) in(a: alloc/free...) out(b: alloc/free ) nocopy(c: alloc/free ) 更新 : #pragma offload offload_transfer target(mic:0) in(a: )out(b: ) #pragma offload target(mic:0) in(a: )out(b: ) #pragma omp target map(x, y) #pragma omp target data device(0) map(to: a) map(from: b) map(alloc: c) #pragma omp target update device(0) to(a) from(b) #pragma omp target device(0) map(always,to: a) map(always,from: b) グローバル 構造化 * *nowait は インテル コンパイラー 16 の 4.5 の機能 * 構造化マッピング (target enter/exit data) は OpenMP 4.5 でサポート 31

内容 デバイス ( アクセラレーター ) 拡張 れ の並列化制御 プロセッサーバインドとアフィニティーの制御 32

OpenMP* 3.1 における並列領域の れ #pragma omp parallel #pragma omp parallel OpenMP* 3.1 では れ になった並列領域の内側は デフォルトでシングルスレッドで実 される OMP_NESTED 環境変数を true に設定すると 内側の領域もマルチスレッドで実 できるが 最 スレッド数は ( 外側のスレッド x 内側のスレッド ) となり オーバーサブスクライブとなる スレッド数とアフィニティーの制御は困難 OpenMP* 4.0 では 数百スレッドを実 できるデバイスでの れ になった並列領域を制御するため teams と distribute 句が追加された サンプルコード : nest.c 33

teams 構 複数レベルの並列デバイスをサポート 構 (C/C++): #pragma omp teams [ 節 [[,] 節 ], ] 構造化ブロック 構 (Fortran):!$omp teams [ 節 [[,] 節 ], ] 構造化ブロック このプラグマの直後は 各チームのマスタースレッドのみが実 し ほかのチームメンバーは次の ( れ 構造の ) 並列領域からのみ実 を開始します そのため 実 中のスレッド数は num_teams のみで それぞれのスレッドは omp_get_thread_num() == 0 になります 節 : num_teams( 整数式 ) thread_limit( 整数式 ) default(shared none) private( リスト ) firstprivate( リスト ) shared( リスト ) reduction( 演算 : リスト )

distribute 構 ループ反復を複数のチームのマスタースレッドで分割 構 (C/C++): #pragma omp distribute [ 節 [[,] 節 ], ] 構造化ブロック このプラグマは teams 構造内の緊密な れ 構造の 1 つ以上のループに関連付けられます collapse を使 すると omp for プラグマで collapse 節を指定した場合と同様に 複数のループを 1 つの反復シーケンスに結合できます 構 (Fortran):!$omp distribute [ 節 [[,] 節 ], ] 構造化ブロック 節 : collapse(n) private( リスト ) firstprivate( リスト ) dist_schedule(static [, chunk_size])

コプロセッサーへ SAXPY をオフロードする int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float SAXPY *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y #pragma omp target data map(to:x[0:n]) { #pragma omp target map(tofrom:y) #pragma omp teams num_teams(num_blocks) thread_limit(nthreads) 全てが同じことを う for (int i = 0; i < n; i += num_blocks){ for (int j = i; j < i + num_blocks; j++) { y[j] = a*x[j] + y[j]; } } } free(x); free(y); return 0; }

コプロセッサーへ SAXPY をオフロードする int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y SAXPY コプロセッサー / アクセラレーター #pragma omp target data map(to:x[0:n]) { #pragma omp target map(tofrom:y) #pragma omp teams num_teams(num_blocks) thread_limit(nthreads) 全てが同じことを う #pragma omp distribute for (int i = 0; i < n; i += num_blocks){ ワークシェア (barrier なし ) #pragma omp parallel for for (int j = i; j < i + num_blocks; j++) { ワークシェア (barrier あり ) y[j] = a*x[j] + y[j]; } } } free(x); free(y); return 0; }

コプロセッサーへ SAXPY をオフロードする SAXPY 複合構 int main(int argc, const char* argv[]) { float *x = (float*) malloc(n * sizeof(float)); float *y = (float*) malloc(n * sizeof(float)); // Define scalars n, a, b & initialize x, y #pragma omp target map(to:x[0:n]) map(tofrom:y) { #pragma omp teams distribute parallel for num_teams(num_blocks) thread_limit(nthreads) for (int i = 0; i < n; ++i){ y[i] = a*x[i] + y[i]; } } free(x); free(y); return 0; }

れ 並列とデバイスへの割り当て オフロードのサンプルコード

内容 デバイス ( アクセラレーター ) 拡張 れ の並列化制御 プロセッサーバインドとアフィニティーの制御 40

スレッド アフィニティー : プロセッサーのバインド バインドの 針は マシンとアプリケーションに依存する スレッドを離して配置 例 異なるパッケージ ( おそらく ) メモリー帯域幅を向上させる ( おそらく ) 統合されたキャッシュサイズを改善 ( おそらく ) 同期構 のパフォーマンスを低下させる スレッドを近づけて配置 例 キャッシュを共有する可能性がある 2 つのコアに隣接 ( おそらく ) 同期構 のパフォーマンスを向上させる ( おそらく ) 利 可能なメモリー帯域幅とキャッシュサイズ ( スレッドごとの ) を低下させる 41

OpenMP* 4.0 におけるスレッド アフィニティー OpenMP* 4.0 で アフィニティーのコンセプトを導... 1 つ以上のプロセッサー上で動作する 連のスレッド ユーザーによって定義される 事前定義された配置 : スレッドハイパースレッドごとに 1 つの位置 コア物理コアごとに 1 つの位置 ソケットプロセッサー パッケージごとに 1 つの位置... そしてアフィニティーのポリシーは... spread close master OpenMP* スレッドをすべての位置に広く配置 OpenMP* スレッドをマスタースレッドの近辺にパック OpenMP* スレッドをマスタースレッドを併置... そしてこれらの設定を制御する 環境変数 OMP_PLACES と OMP_PROC_BIND 並列領域向けに proc_bind 節 42

スレッド アフィニティーの例 例 ( インテル Xeon Phi コプロセッサー ): 外部領域を分配し 内部領域を近く保つ OMP_PLACES=cores(8) #pragma omp parallel proc_bind(spread) #pragma omp parallel proc_bind(close) p0 p1 p2 p3 p4 p5 p6 p7 p0 p1 p2 p3 p4 p5 p6 p7 p0 p1 p2 p3 p4 p5 p6 p7 43

アフィニティー制御の例 オフロードのサンプルコード 環境変数を使 してテスト set MIC_ENV_PREFIX=MIC set MIC_OMP_PROC_BIND=[master, close, spread] $> matmul_dist_para を実 44

内容 デバイス ( アクセラレーター ) 拡張 プロセッサーバインドとアフィニティーの制御 GFX コンパイラーと GFX へのオフロード 45

Gfx コンパイラーインテル グラフィックス テクノロジー プログラミング モデル機能 共有仮想メモリー OpenMP* 4.0 の 部 同期プログラミング サポートの改善 パフォーマンスの改善 共有ローカルメモリー 第 5 世代インテル Core プロセッサー向けにチューニング Gen ターゲット向けのベクトル化機能の改善 利 法 Gfx_sys_check ツール デバッグサポートの改善 46

Gfx コンパイラー OpenMP* 4.0 offload サポートへの追加機能 bool Sobel::execute_offload() { int w = COLOR_CHANNEL_NUM * image_width; float *outp = this->output; float *img = this->image; int iw = image_width; int ih = image_height; #pragma omp target map(to: ih, iw, w) map(tofrom: img[0:iw*ih*color_channel_num], outp[0:iw*ih*color_channel_num]) #pragma omp parallel for collapse(2) for (int i = 1; I < ih 1; i++) { for (int k = COLOR_CHANNEL_NUM; k < (iw - 1) * COLOR_CHANNEL_NUM; k++) { float gx = 1 * img[k + (i - 1) * w -1 * 4] + 2 * img[k + (i - 1) * w +0 * 4] + 1 * img[k + (i - 1) * w +1 * 4] - 1 * img[k + (i + 1) * w -1 * 4] - 2 * img[k + (i + 1) * w +0 * 4] - 1 * img[k + (i + 1) * w +1 * 4]; float gy = 1 * img[k + (i - 1) * w -1 * 4] - 1 * img[k + (i - 1) * w +1 * 4] + 2 * img[k + (i + 0) * w -1 * 4] - 2 * img[k + (i + 0) * w +1 * 4] + 1 * img[k + (i + 1) * w -1 * 4] - 1 * img[k + (i + 1) * w +1 * 4]; outp[i * w + k] = sqrtf(gx * gx + gy * gy) / 2.0; } } return true; } 利 法 : サブセットのみのサポート tofrom と to を pin へマップ -qopenmp-offload=gfx を指定 47

まとめ OpenMP* 4.0 / 4.5 は OpenMP における きな 躍 新しいレベルの並列性を導 デバイス (MIC GPU) への演算のオフロード データの永続性を制御 同期実 を制御 デバイスによる異種システム構成をサポート

参考サイト インテル ソフトウェア フォーラム ナレッジベース 記事 ツールのサポート (http://software.intel.com 参照 http://isus.jp 翻訳版 ) 記事の例 : - http://www.isus.jp/article/parallel-special/requirements-for-vectorizable-loops/ ( ループをベクトル化するための条件 ) OpenMP* 4.5 Specification - http://www.openmp.org5/mp-documents/openmp-4.5.pdf OpenMP* 3.1 仕様をカバーするオンライン トレーニング http://www.isus.jp/online-training/

関連書籍 Structured Parallel Programming: Patterns for Efficient Computation 著者 Michael McCool, James Reinders,Arch Robison 出版 : 2012 年 7 9 ISBN: 978-0-124159938 構造化並列プログラミング: 効率良い計算を うためのパターン 著者マイケル マックール / アーク D ロビソン / ジェームス レインダース ( 共著 ) 訳者菅原清 / エクセルソフト株式会社 ( 共訳 ) ISBN 978-4-87783-305-3 Intel Xeon Phi Coprocessor High Performance Programming 著者 Jim Jeffers, James Reinders 出版 : 2013 年 3 ISBN: 978-0-124104143 インテル Xeon Phi コプロセッサーハイパフォーマンス プログラミング 著者ジェームス レインダース / アーク D ロビソン ( 共著 ) 訳者菅原清 / エクセルソフト株式会社 ( 共訳 ) ISBN 978-4-87783-332-9 High Performance Parallelism Pearls 著者 Jim Jeffers, James Reinders 出版 : 2014 年 11 簡単にインテル Xeon Phi コプロセッサー ファミリーの優れた並列性を利 してコードを実 できるため 最適化に集中し ハイパフォーマンスを実現することが可能です 並列処理を細かくチューニングすることで 正しいアプリケーションを正しく効率良いアプリケーションにすることができます インテルコーポレーションの並列プログラミング エバンジェリストである James Reinders とインテルコーポレーションのエンジニアである Jim Jeffers により執筆された最新の書籍は 69 の専 家の実際の経験を基に インテルのマルチコアおよびメニーコア プロセッサーを最 限に利 するための創意 夫を紹介しています

インテル コンパイラーによるオフロード拡張の変更点 (1) インテル C++ および Fortran コンパイラーのバージョン 16 で OpenMP* 4.0 のオフロード拡張をサポートするにあたり LEO のデータ属性の扱いが変更されました #pragma offload target(mic) in(num_steps, step) inout(sum) #pragma omp parallel for simd reduction(+:sum) private(x) for (i=0;i< num_steps; i++){ x = (i+0.5)*step; sum = sum + 4.0/(1.0+x*x); } インテル コンパイラーのバージョン 15.x ではオフロード時に明 的にデータの target 属性を記述する必要がありましたが バージョン 16 以降では省略できます 52

インテル コンパイラーによるオフロード拡張の変更点 (2) in out inout のデータ属性を省略するとすべての変数に inout が適 される inout で転送されるのは sum のみ 戻る 53