「富岳」におけるOpenMPのタスク並列
２０１９年１１月５日
富士通株式会社
第三基盤ソフトウェア事業部第一開発部
金子 正教

1

Copyright 2019 FUJITSU LIMITED発表内容
 OpenMPのタスク機能の紹介• 言語仕様• サポート範囲• 記述例• タスクの実装• ライブラリを用いた実装• libompについて• 他社のlibomp対応• 富岳の実装• コンパイラ• ライブラリ• C/C++の場合

• まとめ
2

Copyright 2019 FUJITSU LIMITEDOpenMP タスク機能の紹介
 task構文の仕様!$omp task [clause[[,] clause] ...]
structured-block!$omp end task
指示節 (clause) は以下のいずれか 赤字はOpenMP4.5仕様 青字はOpenMP5.0仕様
if ([ task: ] scalar-logical-expression )final ( scalar-logical-expression )untieddefault ( private | firstprivate | shared | none )mergeable
private ( list )firstprivate ( list )shared ( list )depend ( dependance-type : list )priority ( priority-value )in_reduction ( reduction-identifier : list )allocatable ( [ allocator :] list )affinitiy ( [ iterator ( iterators-definition ) :] locator-list )detach ( event-handle )3

Copyright 2019 FUJITSU LIMITED富岳のサポート範囲 (初期公開時)
 task構文
OpenMP4.0仕様○OpenMP4.5仕様
priority指示節△ (動作保証)OpenMP5.0仕様
in_reduction指示節
allocatable指示節
affinity指示節
detach指示節○✕✕✕

4

Copyright 2019 FUJITSU LIMITEDOpenMP タスク機能の紹介
 task構文の記述例!$omp parallel num_threads(4)!$omp single!$omp task

task_A!$omp end task!$omp task

task_B!$omp end task!$omp task

動作イメージ
スレッド0
task_A生成
task_B生成
task_C生成
task_D生成

task_C!$omp end task!$omp task

スレッド1

スレッド2

スレッド3

task_A実行 task_B実行
task_C実行

task_D実行

task_D!$omp end task!$omp end single!$omp end parallel
5

Copyright 2019 FUJITSU LIMITED

タスク機能の実装 ライブラリを用いて実装
 ライブラリの機能• タスク構造体の生成

オブジェクト (疑似コード)
void _foo(){// タスク構造体の生成task = _omp_task_alloc(…);• タスクの起動
ソース
subroutine foo()!$omp task…
!$omp end task
end subroutine// タスクの起動_omp_task(task);} OpenMPの機能(タスク機能を含む)を実現する libomp というランタイムライブラリがある 京ではOpenMP3.1の機能を独自ライブラリで実装
 富岳のコンパイラでは libomp を採用して、OpenMP4.0以降を実装
6

Copyright 2019 FUJITSU LIMITEDlibomp libompとは OpenMPのランタイムライブラリ 正式名称： LLVM OpenMP Runtime Library libompという名称は、ライブラリ名（libomp.so）から

 IntelのOpenMPライブラリ libiomp5（OSS版）がLLVMプロジェクトに取り込まれたもの

 業界標準 ARM,Intelの各商用コンパイラで採用されている
 GCCとオブジェクト互換がある ライセンス University of Illinois/NCSA Open Source License（LLVMと同じ）と、
MIT Licenseのデュアルライセンス
 IntelのCopyright、および使用許諾契約
 ARMの使用許諾契約
7

Copyright 2019 FUJITSU LIMITED他社の libomp 対応
GNUオブジェクト(gcc/gfortran)

INTELオブジェクト(icc/ifort)

LLVMオブジェクト(clang/flang)libiomp5

libomplibgompエントリ(GOMPラッパー)-lgomp(default)

libgomp-lomp(-liomp5)
libomp (libiomp5)

8Copyright 2019 FUJITSU LIMITED富岳の実装 (コンパイラ)
 処理フロー
OpenMPプログラムa.f90FE構文解析、コンパイラ内部構造の生成

OMP

OpenMP指示行に対する処理
ラッパーを介したOpenMPライブラリ(libomp)の呼出し生成、コード変換(collapse)、最適化指示(simdなど)の生成

OBE

最適化（simd化、自動並列化など）

CO

コード生成

a.s
9

Copyright 2019 FUJITSU LIMITED富岳の実装 (ライブラリ)
 タスクを libompで実装
 タスク構造体の生成: __kmpc_omp_task_alloc()
 タスクの起動:__kmpc_omp_task()

 private変数のメモリ割り付けの考慮
firstprivate変数の生成とコピーをオブジェクトで行う

 libompの富岳向け独自拡張
 コア間ハードバリア対応
 セクタキャッシュ対応

10

Copyright 2019 FUJITSU LIMITED富岳の実装 (C/C++) 【clangモード】 OpenMP4.0以降の仕様をLLVMベースで実装-Nclang オプション
コンパイラ ： LLVMベース
ライブラリ ： LLVM OpenMPライブラリ (libompベースの富岳向け拡張ライブラリ) 【tradモード(default)】 京との互換のあるコンパイラとランタイム-Nnoclangオプション
コンパイラ ： OpenMP3.1+OpenMP4.0のsimd機能
ライブラリ ： 富士通OpenMPライブラリとLLVM OpenMPライブラリをオプションで切り替え
clangモード

tradモード-Nclangオプション -Nnoclangオプション

LLVM OpenMPライブラリ(libomp)-Nlibompオプション

富士通OpenMPライブラリ-Nfjomplibオプション
11

結合可

結合可 (default)

結合不可

結合可
Copyright 2019 FUJITSU LIMITED富岳の実装 (ライブラリ)
 LLVM OpenMPライブラリ内に富士通OpenMPインタフェースを変換するラッパーを実装
frt/fcc/FCC(__jwe_xxxを生成)-Nfjomplib

fcc/FCC(__kmpc_xxxを生成)-Nclang-Nlibomp (default)__jwe_xxx インターフェース__jwe_xxx 変換ラッパー__kmpc_xxx インターフェース

LLVM OpenMPライブラリ (libomp)

富士通OpenMPライブラリ

12

Copyright 2019 FUJITSU LIMITEDまとめ タスク機能の富岳での実装を紹介しました 京との互換を持ちつつ、新しい実装にチャレンジしています 富岳の完成後もOpenMPの規格に追随します13

Copyright 2019 FUJITSU LIMITED14

Copyright 2019 FUJITSU LIMITED