Microsoft PowerPoint - 002_OpenMP 5.0_2018_Part2

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

Microsoft PowerPoint - 02_What is OpenMP 4.0 offload_Jan18

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

PowerPoint Presentation

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

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

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

Jackson Marusarz 開発製品部門

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

IntelR Compilers Professional Editions

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

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

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

Microsoft PowerPoint - OpenMP入門.pptx

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

Microsoft PowerPoint - 09.pptx

Microsoft Word - openmp-txt.doc

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

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

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

インテル® VTune™ Amplifier XE を使用したストレージ向けの パフォーマンス最適化

演習1: 演習準備

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ

Code Modernization Online training plan

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

使用する前に

02_C-C++_osx.indd

概要 プログラミング論 変数のスコープ, 記憶クラス. メモリ動的確保. 変数のスコープ 重要. おそらく簡単. 記憶クラス 自動変数 (auto) と静的変数 (static). スコープほどではないが重要.

Presentation title

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Slide 1

ArcGIS Runtime SDK for .NET アプリケーション配布ガイド

slide5.pptx

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

インテル® Fortran Studio XE 2011 SP1 Windows* 版インストール・ガイドおよびリリースノート

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

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

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

並列アプリケーション向けインテル® TBB スケーラブル・メモリー・アロケーターの活用

02: 変数と標準入出力

01_OpenMP_osx.indd

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

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

02: 変数と標準入出力

Intel® Compilers Professional Editions

McAfee SaaS Protection 統合ガイド Microsoft Office 365 と Exchange Online の保護

スライド 1

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

インテル® VTune™ Amplifier : Windows 環境向けスタートガイド

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

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

NUMAの構成

Python によるジオプロセシング スクリプト入門

インテル® C++ コンパイラー 17.0 Update 4 for Linux* リリースノート (インテル® Parallel Studio XE 2017)

インテル® Fortran コンパイラー 17.0 Update 4 for Linux* リリースノート (インテル® Parallel Studio XE 2017)

Microsoft PowerPoint - VSUGDAY_2008_Intel_V2.ppt

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - compsys2-06.ppt

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

Microsoft PowerPoint - kougi7.ppt

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

Python によるジオプロセシング スクリプト入門

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

Insert your Title here

プログラミング実習I

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint pptx[読み取り専用]

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

POSIXスレッド

コードのチューニング

演算増幅器

PowerPoint プレゼンテーション

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

インテル® ソフトウェア・カンファレンス福岡 インテル® コンパイラーを使用する際に直面するよくある問題と課題

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

Jungo LTD. COPYRIGHT Copyright (c) Jungo Ltd. All Rights Reserved. Jungo Ltd. POB8493 Netanya Zip Israel Phone (USA) (W

Click to edit title

Taro-ポインタ変数Ⅰ(公開版).j

PowerPoint プレゼンテーション

memo

プログラミング基礎I(再)

memo

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

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

21 章のお話

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

The 3 key challenges in programming for MC

Prog1_6th

PowerPoint Presentation

Microsoft Word - UniversalShield_Hitachi.doc

Using VectorCAST/C++ with Test Driven Development

1 つのツールを実行するだけで違いが出るのでしょうか? はい 多くの場合 複雑なバグを発見して アプリケーションの安定性を向上させることができます このガイドでは インテル Inspector XE 解析ツールを使用して コードの問題を排除する方法を説明します これにより コードの信頼性が向上し 開

N08

Click to edit title

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Transcription:

インテル コンパイラー V19.0 による並列プログラミング : OpenMP* 5.0 プレビュー Part 2 2018 年 10 月 isus 編集部すがわらきよふみ 1

このセッションの目的 明示的な並列プログラミング手法として注目されてきた OpenMP* による並列プログラミングに加え インテル コンパイラーがサポートする OpenMP* 4.0 と 4.5 の機能を使用したベクトル プログラミングとオフロード プログラミングの概要をリフレッシュし インテル コンパイラー V19.0 でサポートされる OpenMP* 5.0 の機能と実装を紹介します セッションの対象者 既に OpenMP* でマルチスレッド プログラミングを開発し 4.0 以降でサポートされる新たなベクトル化とオフロードを導入し アプリケーションのパフォーマンス向上を計画する開発者 2

本日の内容 概要 (OpenMP* とは 歴史 各バージョンの機能概要 ) OpenMP* 4.0 4.5 の機能と 5.0 の新機能タスク omp simd オフロードメモリー操作アフィニティー 3

インテル コンパイラー V19.0 での重要な変更点 インテル C/C++ および Fortran コンパイラー 19.0 では デフォルトで /Qopenmp-simd (-qopenmp-simd) オプションが有効になります #pragma omp simd (!$ OMP SIMD) #pragma omp declare simd (!$ OMP DECLARE SIMD) #pragma omp for simd 無効にするには /Qopenmp-simd- (-qopenmp-simd-) を指定します インテル C/C++ および Fortran コンパイラー 19.0 では /Qopenmpoffload:gfx (-qopenmp-offload=gfx) が未サポートとなりました 4

OpenMP* 5.0 のメモリーと同期管理 5

メモリー管理ディレクティブ OpenMP メモリー空間は 変数を格納および取得できるストレージリソースを表します 特定のメモリー空間を選択するため 事前定義メモリー空間とアロケーター特性が定義されています 特定のメモリー空間の選択は 割り当てのため特定の特性を有するストレージを使用することを意味します 各メモリー空間の実際のストレージリソースは実装により定義されます事前定義メモリー空間 メモリー空間名 omp_default_mem_space omp_large_cap_mem_space omp_const_mem_space omp_high_bw_mem_space omp_low_lat_mem_space ストレージ選択の意味システムのデフォルトストレージを表します 大容量のストレージを表します 定数値の変数向けに最適化されたストレージを表します このストレージへの書き込み結果は不定です 高い帯域幅のストレージを表します 低レイテンシーのストレージを表します 6

メモリー アロケーター OpenMP* のメモリー アロケーターは プログラムが割り当て要求に使用できます メモリー アロケーターは 特定サイズのストレージ割り当て要求を受け取ると 少なくとも要求されたメモリー空間のリソース内に論理的に連続したサイズのメモリーを割り当てようとします 事前定義アロケーター アロケーター名 関連するメモリー空間 デフォルト以外の特性値 omp_default_mem_alloc omp_default_mem_space ( なし ) omp_large_cap_mem_alloc omp_large_cap_mem_space ( なし ) omp_const_mem_alloc omp_const_mem_space ( なし ) omp_high_bw_mem_alloc omp_high_bw_mem_space ( なし ) omp_low_lat_mem_alloc omp_low_lat_mem_space ( なし ) omp_cgroup_mem_alloc 実装定義 access:cgroup omp_pteam_mem_alloc 実装定義 access:pteam omp_thread_mem_alloc 実装定義 access:thread 7

新しい allocate ディレクティブと節 V19.0 では未サポート 新しい allocate ディレクティブは API 呼び出しで割り当てられない変数の割り当てを制御するために提案されました ( 自動変数または静的変数など ) OpenMP* ディレクティブによる割り当て操作に使用できます ( 変数のプライベート コピーなど ) #pragma omp allocate(a,b) memtraits(bandwidth=highest, pagesize=2*1024*1024) int a[n], b[m]; void example() { #pragma omp parallel private(b) allocate(memtraits(latency=lowest):b) { //... 2MB ページを使用する最も高い帯域幅のメモリーに変数 a と b の割り当てを変更 8

OpenMP* 4.5 のロックのヒントを変更 現代のプロセッサー アーキテクチャーの中には トランザクショナル メモリーをサポートするものがある 例えば インテル TSX ( インテル Transactional Synchronization Extensions ) この機能が同期 ( ロック ) を最適に実行するかどうかは 競合条件に依存開発者は コンパイラーの実装へこの情報を渡す意味を知っている必要がある OpenMP* 4.5 では これに相当する拡張を提供 : 追加された OpenMP* API/ ランタイムルーチン : omp_init_lock_with_hint(omp_lock_t *lock, omp_lock_hint_t hint) omp_init_nest_lock_with_hint(omp_nest_lock_t *lock, omp_lock_hint_t hint) サポートされるヒント : omp_lock_hint_none omp_lock_hint_uncontended omp_lock_hint_contended omp_lock_hint_nonspeculative omp_lock_hint_speculative critical 構文の新たな節 hint(type): type は 新しいロック API と同じ値を指定可能 9

OpenMP* 5.0 で同期のヒントを定義 ロックヒント (Lock hint) の名前が同期ヒント (synchronization hint) に変更されました 古い名前は廃止予定です OpenMP* ロック機能の一部 : C/C++ の omp_lock_hint_t と Fortran の omp_lock_hint_kind タイプを廃止予定 および ロックのヒント定数 omp_lock_hint_none omp_lock_hint_uncontended omp_lock_hint_contended omp_lock_hint_nonspeculative および omp_lock_hint_speculative を廃止 lock sync 10

ヘテロジニアス コンピューティングをサポートする target ( または Offload) 構造の拡張 11

データ共有 / マッピング : 共有もしくは分散メモリー 共有メモリー プロセッサー X キャッシュ A メモリー A コプロセッサー Y キャッシュ A 分散メモリー プロセッサー X キャッシュ A メモリー X A コプロセッサー Y 例 : インテル Xeon Phi コプロセッサー メモリー Y A スレッドは共有メモリーへアクセスできる共有データ向けに各スレッドは 同期バリア間の共有メモリーの一時的なビューを保持スレッドはプライベート メモリーを持つプライベート データ向けに各スレッドは 実行される各タスクのローカル データ スタックを保持 デバイスデータ環境に対応する変数は 元の変数とストレージを共有 対応する変数への書き込みは 元の変数の値を更新 12

OpenMP* 4.0/4.5 Target 拡張 ターゲットデバイス上で実行するためコードをオフロード omp target [ 節 [[,] 節 ], ] [nowait] 構造化ブロック omp declare target [ 関数定義または宣言 ] ターゲットデバイスへ変数をマップ map ([ マップタイプ修飾子 ][ マップタイプ :] リスト ) マップタイプ := alloc tofrom to from release delete マップタイプ修飾子 : always omp target [enter exit] data [ 節 [[,] 節 ], ] 構造化ブロック omp target update [ 節 [[,] 節 ], ] omp declare target [ 関数定義または宣言 ] アクセラレーション向けのワークシェア omp teams [ 節 [[,] 節 ], ] 構造化ブロック omp distribute [ 節 [[,] 節 ], ] for ループランタイム サポート ルーチン void omp_set_default_device(int dev_num ) int omp_get_default_device(void) int omp_get_num_devices(void); int omp_get_num_teams(void) int omp_get_team_num(void); Int omp_is_initial_device(void); 環境変数 OMP_DEFAULT_DEVICE を介してデフォルトデバイスを制御負ではない整数値赤字が OpenMP* 4.5 での拡張 1

オフロードとデバイスデータのマッピング target 構文を使用してホストからターゲットデバイスへ制御を転送ホストとターゲットデバイスのデータ環境間で変数をマップ pa ホスト 4 from( ) ホストスレッドはターゲット ( オフロードされた ) タスクをスポーン同期オフロード ( スレッドはターゲットタスクを待機 ) 非同期オフロード ( スレッドはターゲットタスクを待機することなく継続 ) デバイス 1 alloc( ) map 節は データ環境の元の変数をデバイスデータ環境の対応する変数にどのようにマップするかを決定する 2 to( ) #pragma omp target map(alloc:...) map(to:...) map(from:...) {... 3 14

例 : target + map #define N 1000 #pragma omp declare target float p[n], v1[n], v2[n]; #pragma omp end declare target extern void init(float *, float *, int); extern void output(float *, int); void vec_mult() { int i; init(v1, v2, N); #pragma omp target update to(v1, v2) #pragma omp target #pragma omp parallel for simd for (i=0; i<n; i++) p[i] = v1[i] * v2[i]; グローバル変数がプログラム全体でデバイスデータ環境にマップされることを示す ホストとデバイス間で一貫性を保つため target update を使用する parallel for simd ループがターゲットへオフロードされることを示す #pragma omp target update from(p) output(p, N); 15

例 : OpenMP* 4.0 での非同期オフロード実装 OpenMP* 4.0 の target 構文は 非同期オフロードをサポートするため既存の OpenMP* の機能 (task) を活用できる #pragma omp parallel sections { #pragma omp task { #pragma omp target map(in:input[:n]) map(out:result[:n]) #pragma omp parallel for for (i=0; i<n; i++) { result[i] = some_computation(input[i], i); #pragma omp task { do_something_important_on_host(); ホストターゲット ホスト 1

例 : OpenMP* 4.5 での非同期オフロード実装 非同期オフロードをサポートするため target 構文に nowait 節が追加された taskwait で待機 #pragma omp parallel sections { #pragma omp target map(in:input[:n]) map(out:result[:n]) nowait #pragma omp parallel for for (i=0; i<n; i++) { result[i] = some_computation(input[i], i); // 以下をホストで非同期に実行 do_something_important_on_host(); #pragma omp taskwait ホストターゲットホスト 1

teams+distriobute+parallel for を使用したオフロードの例 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) 1 つ以上のループの反復を実行するスレッドチームを生成 マスタースレッドで実行を開始 すべてが同じことを行う #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; 1 つ以上のループの反復をすべてのスレッドチームのマスタースレッド間で共有するかどうかを指定 distribute されたスレッドのチームで ループ反復をワークシェア 18

OpenMP* と OpenACC* の比較例 OpenMP* 4.0 / 4.5 チームとスレッド間で parallel for ループをアクセラレート #pragma omp target teams map(x[0:n]) num_teams(numblocks) #pragma omp distribute parallel for for (i=0; i<n; ++1) { X[i] += sin(x[i]); OpenACC* 2.0 / 2.5 ギャングとワーカー間で for ループをアクセラレート #pragma acc parallel copy(x[0:n]) num_gangs(numblocks) #pragma acc loop gang worker for (i=0; i<n; ++i) { X[i] += sin(x[i]); 19

OpenMP* と OpenACC* 対応 機能 OpenACC* OpenMP* オフロード parallel または kernels target データ環境 data target data データ転送 変数定義 copy( 変数 )/ create( 変数 ) map(tofrom: 変数 ) map(alloc: 変数 ) 並列処理 ( チーム ) 並列処理 loop gang num_gangs(n) loop vector vector_length(n) teams distribute num_teams(n) thread_limit(n) parallel for 20

OpenMP* 5.0 の offload 拡張 プログラマーの負担を軽減するため いくつかの関数 (C C++ Fortran) とサブルーチン (Fortran) で暗黙の declare target ディレクティブが追加されました 入れ子になった declare target ディレクティブのサポートが追加されました デバイス固有の関数実装をサポートするため declare target ディレクティブに implements 節が追加されました 複雑なデータタイプのマッピングをサポートするため declare mapper ディレクティブが追加されました 配列セクションへのマップで ポインター変数へのマップ (C/C++) とデバイスメモリーのアドレス割り当てが追加されました スレッドがどのデバイスで実行されているかを特定するため omp_get_device_num ランタイムルーチンが追加されました オフロード動作の制御をサポートするため OMP_TARGET_OFFLOAD 環境変数が追加されました 21

暗黙の declare target ディレクティブ オフロード領域で呼び出されている関数を自動的に検出して それらの関数が declare target ディレクティブで指定されているかのように扱います OpenMP* 4.5 では オフロード領域で呼び出されるすべての関数は declare target ディレクティブによって明示的にタグ付けされている必要がありました #pragma omp declare target void foo() { //... #pragma omp end declare target void bar() { #pragma omp target { foo(); OpenMP* バージョン 4.5 のスタイル void foo() { //... void bar() { #pragma omp target { foo(); OpenMP* バージョン 5.0 のスタイル 22

静的記憶域を含む変数の自動検出 OpenMP* 5.0 では 静的記憶域を含む変数も自動的に検出できます これにより 次の 2 つの例は等価となります int x; #pragma omp declare target to (x) void bar() { #pragma omp target { x = 5; OpenMP* バージョン 4.5 のスタイル int x; void bar() { #pragma omp target { x = 5; OpenMP* バージョン 5.0 のスタイル 23

配列セクションへのマップで ポインター変数へのマップ (C/C++) とデバイスメモリーのアドレス割り当て OpenMP* バージョン 4.5 では use_device_ptr 節が追加されましたが use_device_ptr の変数は 使用する前にマップする必要があります 変数は 1 つのデータ節にのみ記述できるため プログラマーは個別の #pragma target data 節を記述する必要がありました : #pragma omp target data map(buf) #pragma omp target data use_device_ptr(buf) OpenMP* 5.0 では 単一構文で変数を map 節と use_device_ptr 節の両方に記述できる例外が追加されました : #pragma omp target data map(buf) use_device_ptr(buf) 24

つづき OpenMP* 4.5 では 最初の構造がターゲットである結合構造の reduction 節または lastprivate 節で使用されるスカラー変数は ターゲット構造の firstprivate として扱われます ホストの変数が更新されることはありません ホストの変数を更新するには プログラマーは結合構造から omp target ディレクティブを分離してスカラー変数を明示的にマップする必要があります OpenMP* 5.0 では これらの変数は自動的に map(tofrom:variable) が適用されているかのように扱われます 25

omp declare target の静的データメンバー OpenMP* 5.0 では スタティック データ メンバーが omp declare target 構文内のクラスで使用できるようになりました また スタティック メンバーを含むクラス オブジェクトは map 節でも使用できます #pragma omp declare target class C { static int x; int y; class C myclass; #pragma omp end declare target void bar() { #pragma omp target map(myclass) { myclass.x = 10 26

入れ子になった target のサポート 外側の omp target data 構文内で構造体変数のフィールドをマップして 内側の入れ子の omp target 構文内で構造体変数のアドレスを使用すると 構造体の一部がすでにマップされている場合 構造体変数全体をマップしようとします struct {int x,y,z st; int A[100]; #pragma omp target data map(s.x A[10:50]) { #pragma omp target { A[20] = ; // OpenMP*4.5 ㅲㅺㆲ ㄉ 5.0 ㅲㅺ OK foo(&st); // OpenMP*4.5 ㅲㅺㆲ ㄉ 5.0 ㅲㅺ OK #pragma omp target map(s.x, A[10:50]) { A[20] = ; // OpenMP*4.5 ㅳ 5.0 ㅹ籚 ㅲ OK foo(&st); // OpenMP*4.5 ㅳ 5.0 ㅹ籚 ㅲ OK OpenMP 5.0 では プログラマーが想定した動作になるように これらのケースが修正されました 27

ヘテロジニアス プログラミングの向上 OpenMP* のデバイスサポートを向上のために次のような機能が検討されています : 現在 map 節の構造は 構造のポインターフィールドを含めて ビット単位でコピーされます 委員会は 構造のポインターフィールドのサポートを拡張することにより プログラマーが map 節を使用して構造のポインターフィールドの自動割り当て / 割り当て解除を指定できるようにする拡張について議論しています 関数ポインターを target 領域で使用できるようにすること および関数ポインターを declare target に記述できるようにすることを検討しています 非同期に実行できる新しいデバイス memcpy ルーチンのサポート target 構文の デバイスで実行または失敗 セマンティクスのサポート 現在 デバイスが利用できない場合 ターゲット領域はホストで実行されます デバイスのみに存在し ホストベースのコピーでない変数や関数のサポート 単一アプリケーションでの複数のデバイスタイプのサポート 28

その他の機能 29

OpenMP* 5.0 のツール インターフェイス OpenMP API を実装して開発された OpenMP プログラムの監視 パフォーマンス または正当性の解析とデバッグをサポートする高品質で移植性のあるツールの開発を可能にするため OpenMP API に OMPT と OMPD の 2 つのインターフェイスが追加されています 30

OMPT と OMPD OMPT インターフェイスは ファースト パーティー ツール向けに以下を提供 : ファースト パーティー ツールを初期化するメカニズム ツールが OpenMP 実装機能の判断を可能にするルーチン ツールがスレッドに関連する OpenMP 状態情報の調査を可能にするルーチン ツールが実装レベルの呼び出しコンテキストをソースレベルに対応付けるためのメカニズム ツールが OpenMP イベントの通知を受信することを可能にするコールバック インターフェイス ツールが OpenMP ターゲットデバイス上のアクティビティーをトレースすること可能にするトレース インターフェイス アプリケーションがツールのコントロールに使用できるランタイム ライブラリー ルーチン OMPD は以下を定義します : ツールが実行を開始したプログラムの OpenMP 状態にアクセスするのに使用する OMPD ライブラリーがエクスポートするインターフェイス ライブラリーが OMPD ライブラリーを使用して実行を開始したプログラムの OpenMP 状態にアクセスできるよう ツールが OMPD ライブラリーに提供するコールバック インターフェイス ツールが OpenMP 実装に使用する適切な OMPD ライブラリーを検出してイベントの通知を容易にするため OpenMP 実装によって定義される最小限のシンボル情報 31

廃止予定の機能 ICV nest-var の廃止に伴う廃止予定の機能 : OMP_NESTED 環境変数 omp_set_nested および omp_get_nested API OpenMP* ロック機能の一部 C/C++ の omp_lock_hint_t と Fortran の omp_hint_hint_kind タイプを廃止予定 および ロックのヒント定数 omp_lock_hint_none omp_lock_hint_uncontended omp_lock_hint_contended omp_lock_hint_nonspeculative および omp_lock_hint_speculative 32

インテル コンパイラーの OpenMP* サポート状況 インテル コンパイラー 16.0 は ほとんどすべての OpenMP* 4.0 といくつかの OpenMP* 4.5 仕様をサポート インテル コンパイラー 17.0 は大部分の OpenMP* 4.5 仕様をサポート ロックとクリティカル領域のトランザクショナル メモリー サポートを除く 2016 年 9 月リリース インテル コンパイラー 18.0 は OpenMP* 5.0 TR4 をサポート 2017 年 9 月リリース インテル コンパイラー 19.0 は OpenMP* 5.0 TR6 の一部をサポート 2018 年 9 月リリース 33

参考資料 OpenMP* 5.0 TR7 の仕様抜粋訳 インテル コンパイラー 18.0 の OpenMP* 5.0 サポート OpenMP* 誕生から 20 年 Part1 OpenMP* 誕生から 20 年 Part2 現在と将来の OpenMP* API 仕様 OpenMP* バージョン 4.5: 標準化の進化 OpenMP サポートのまとめオンライン トレーニング コース : インテル コンパイラーによる OpenMP* 入門 (8 回 ) OpenMP* 4.x による新しいレベルの並列化 (2 回 ) インテル VTune Amplifier + OpenMP* によりスレッドのパフォーマンスとスケーラビリティーを向上する インテル ソフトウェア開発製品ライブ ウェビナー シリーズ 34

Intel インテル Intel ロゴ Intel Inside ロゴは アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です * その他の社名 製品名などは 一般に各社の商標または登録商標です インテル ソフトウェア製品のパフォーマンス / 最適化に関する詳細は Optimization Notice ( 最適化に関する注意事項 ) を参照してください 2018 Intel Corporation. 無断での引用 転載を禁じます Copyright 2018 isus 35