FX1000利用のためのプログラミングガイド活用
2022年9月13日
富士通株式会社

ミッションクリティカルシステム事業本部
ＵＮＩＸ＆ＦＸシステム事業部

ＦＸ言語ソフトウェア部

中村朋健© 2022 Fujitsu Limited目次○プログラミングガイド概要・種類○各プログラミングガイドの紹介○プログラミング共通編○プロセッサ編○Fortran編○チューニング編○プログラミングガイドの活用例

2© 2022 Fujitsu Limited

プログラミングガイドの概要○ 概要○ FX1000の利用者がプログラミングやチューニングするうえで役立つ情報をまとめたガイド○ 使用手引書などの製品マニュアルは仕様や機能を網羅的かつ詳細に記載、一方、プログラミングガイドはプログラミングやチューニングに具体的に適用できる内容を記載○ 利用者ポータル HPC Portal マニュアルの言語製品を選択○ https://portal.cc.nagoya-u.ac.jp/cgi-bin/hpcportal.ja/index.cgi

3© 2022 Fujitsu Limited

プログラミングガイドの種類○プログラミングガイドの種類○各ガイドは和文と英文を用意

内容
プログラミング共通編

言語製品の構成、コンパイラの種類や使い分けなどをまとめたガイド。

プロセッサ編FX1000のプロセッサA64FXの特徴、マイクロアーキ、および性能情報をまとめたガイド。プロセッサの諸元や基礎性能値を説明。

Fortran編

Fortranを使用してプログラミングやチューニングするときの注意点をまとめたガイド。

チューニング編

1コア内やスレッド並列でチューニングするときに役立つ情報をまとめたガイド。様々なチューニング手法を適用したときのチューニングの効果について説明。
Fortranのチューニング例のみで記載していたが、C/C++利用者からの要望も多く、2022年7月の更新でC/C++のチューニング方法を追加。
4© 2022 Fujitsu Limited

プログラミング共通編 1/2○ プログラミング共通編の主な記載内容
言語製品の構成、コンパイラの種類や使い分けなどをまとめたガイド。

○ 言語パッケージの内容○ コンパイラ推奨オプション○ C/C++のtradモードとclangモード○ 他社コンパイラが生成するオブジェクトの互換○ clangモードのオプションと最適化指示子○ OpenMPライブラリ（LLVM OpenMPと富士通OpenMP）○ 従来システムからの移行○ コンパイラによる高速化○ tradモードのデバッグ機能○ ラージページ○ 注意事項5© 2022 Fujitsu Limited

プログラミング共通編 2/2○「プログラミング共通編」の例

ユーザ様が迷いやすいところ○tradモードとclangモードの使い分け

6© 2022 Fujitsu Limitedプロセッサ編 1/3○主な記載内容
FX1000のプロセッサA64FXの特徴、マイクロアーキ、および性能情報をまとめたガイド。
プロセッサの諸元や基礎性能値を説明。

○A64FXプロセッサの概要・諸元○L2キャッシュの利用○マイクロアーキ○基礎カーネル性能

7© 2022 Fujitsu Limitedプロセッサ編 2/3○「プロセッサ編」の例○A64FXプロセッサの諸元

チューニングする上で基礎となる情報

8© 2022 Fujitsu Limitedプロセッサ編 3/3○「プロセッサ編」の例

各システムの特徴を把握する情報○A64FXプロセッサの基礎性能

9© 2022 Fujitsu Limited

Fortran編 1/3○ 主な記載内容
Fortranを使用してプログラミングやチューニングするときの注意点をまとめたガイド。

○ 最適化指定○ 推奨オプション○ SIMD、SWPL○ プリフェッチ
○ ループの最適化○ ロード・ストア○ リンク時最適化○ OpenMP○ オプションの注意事項○ 翻訳情報（診断メッセージ・ガイダンスメッセージ）○ プログラム実行○ プログラミング時の注意事項
10© 2022 Fujitsu Limited

Fortran編 2/3○「Fortran編」の例

Fortran固有の機能で役立つチューニング

○do concurrentによるデータ依存の解消○ データ依存を解消する記載方法○ do concurrentによるデータ依存の有無○ 最適化の効果の有無

11© 2022 Fujitsu Limited

Fortran編 3/3○「Fortran編」の例○pointerとallocatableの違い機能差がわかりにくい仕様○ pointerとallocatableの指定方法○ データ依存の有無○ 最適化の効果の有無

12© 2022 Fujitsu Limitedチューニング編 1/4○ 主な記載内容
1コア内やスレッド並列でチューニングするときに役立
つ情報をまとめたガイド。様々なチューニング手法を適用したときのチューニングの効果について説明。

○ ボトルネックの調査○ 1コアチューニング

○ データ局所性の改善○ データアクセス待ちの改善○ スラッシングの改善○ SIMD化による改善○ 演算待ちの改善○ マイクロアーキ依存の改善○ スレッド並列チューニング

Fortranに加えてC/C++の例を記載○ 並列化率の改善○ 実行効率の改善○ ラージページによる改善○ メモリ使用量の改善

13© 2022 Fujitsu Limitedチューニング編 2/4○「チューニング編」の例○プロファイラ(CPU性能解析レポート)の見方

14

チューニングでよく使うツール。
チューニング編を理解する上では必要な情報© 2022 Fujitsu Limitedチューニング編 3/4○「チューニング編」の例○ループ分割による性能向上

A64FX上でチューニングする上ではSWPL化が非常に重要であり、その促進ための方法の一つ

15© 2022 Fujitsu Limitedチューニング編 4/4○「チューニング編」の例

ハマると性能劣化の影響が大きく注意が必要○False Sharingによるチューニング

16© 2022 Fujitsu Limited

プログラミングガイドの活用例
OSSアプリケーションLAMMPSへの適用

17© 2022 Fujitsu Limited

LAMMPSのチューニング
○ LAMMPSの概要○ 科学技術計算に用いられる著名なOSSアプリケーション（C/C++でプログラミング）○ 富士通プロファイラを用いたボトルネックの調査から以下の情報を得られた○ NPairHalfBinNewtonOmp::buildの手続きコストが最も大きい○ 上記手続きでは浮動小数点演算待ちに多くのコストを費やしている

Cost% Operation (s)Barrier%Start
End-------------------------------------------------------------------------348 100.0000
3.477900.0000---------------------------------------------------------------------------134
38.5057
1.339200.0000--96
27.5862
0.959400.0000
88
175
29
8.33330.289800.0000
82
160
15
4.31030.149900.00007789
10
2.8736
0.099900.0000--9
2.58620.089900.0000--6
1.72410.060000.0000
348
358

Process

9

LAMMPS_NS::NPairHalfBinNewtonOmp::build(LAM ...
void LAMMPS_NS::PairLJCutOMP::eval<0, 0, 1> ...
void LAMMPS_NS::BondFENEOMP::eval<0, 0, 1>(i...
LAMMPS_NS::RanMars::uniform()
mca_btl_vader_component_progress
LAMMPS_NS::NPair::find_special(int const*, i...
LAMMPS_NS::Atom::map_find_hash(int)

富士通プロファイラ(基本プロファイラ)による手続きコスト情報

18

浮動小数点
演算待ちコスト

富士通プロファイラによる
NPairHalfBinNewtonOmpのサイクルアカウンティング© 2022 Fujitsu Limited

LAMMPSにSWPLを適用○2種類のチューニングでSWPL化を促進
ibin = atom2bin[i];for (k = 0; k < nstencil; k++) {for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) {jtype = type[j];if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue;delx = xtmp - x[j][0];dely = ytmp - x[j][1];delz = ztmp - x[j][2];rsq = delx*delx + dely*dely + delz*delz;

処理Z

処理X}}

ループ
分
割

#pragma clang loop vectorize(disable)for (k = 0; k < j_count; k++) {処理Y（delx、dely、delz、rsqは配列に拡張）}(※)

if (rsq <= cutneighsq[itype][jtype]) {if (molecular) {if (!moltemplate)which = find_special(special[i],nspecial[i],tag[j]);else if (imol >=0)
which = find_special(onemols[imol]->special[iatom],onemols[imol]->nspecial[iatom],tag[j]-tagprev);else which = 0;
if (which == 0) neighptr[n++] = j;else if (domain->minimum_image_check(delx,dely,delz))neighptr[n++] = j;else if (which > 0) neighptr[n++] = j ^ (which << SBBITS);} else neighptr[n++] = j;}#pragma clang loop vectorize(assume_safety)for (k = 0; k < nstencil; k++) {for (j = binhead[ibin+stencil[k]]; j >= 0; j = bins[j]) {

処理X
処理Y

(※) ループ分割：チューニング編P180
ループアンスイッチング：チューニング編P216}}

チューニング前19(※)

ループ内の条件が成立した場合と成立しない場合のループに分けること
で、分岐を減らしソフトウェアパイプライニングを促進させる最適化

ループアンスイッチング

if (molecular && !moltemplate) {#pragma clang loop vectorize(assume_safety)for (k = 0; k < j_count; k++) {処理Z}}
if (molecular && moltemplate && imol >= 0) {for (k = 0; k < j_count; k++) {処理Z}}
if (molecular && moltemplate && imol < 0) {for (k = 0; k < j_count; k++) {処理Z}}
if (!molecular) {for (k = 0; k < j_count; k++) {処理Z}}

チューニング後© 2022 Fujitsu Limited

LAMMPSをチューニングした効果○前ページ部分のチューニング効果

浮動小数点演算待ちが減少

チューニング前チューニング後

ループ分割やループアンスイッチングすることにより、ソフトウェアパイプライニングが促進し、浮動小数点演算待ちが減ることで性能向上した例
20© 2022 Fujitsu Limited

LAMMPSに適用したチューニング手法○チューニングによるLAMMPSの高速化○SWPL化を促進するために適用したチューニング(活用例)○ ループ分割○ ループアンスイッチング○上記以外に適用した手法○ ストライピング○ ループアンローリング○ etc

プログラム全体で1.8倍の高速化
FX1000上でのプログラミングやチューニングにご活用ください21© 2022 Fujitsu Limited

Thank you© 2022 Fujitsu Limited