30
一般財団法人高度情報科学技術研究機構 Research Organization for Information Science and Technology (RIST) 質問は随時受け付けます E-mail ([email protected]) もご利用ください チューニング技法入門: チューニングの基礎

チューニング技法入門 チューニングの基礎...2020/08/19  · チューニング技法入門: チューニングの基礎 Part.1: チューニングの基礎 トピックス:

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

  • 一般財団法人高度情報科学技術研究機構Research Organization for Information Science and Technology (RIST)

    質問は随時受け付けますE-mail ([email protected]) もご利用ください

    チューニング技法入門: チューニングの基礎

  • チューニング技法入門: チューニングの基礎

    [A] 青山幸也「チューニング技法虎の巻」(平成28年8月1日版)

    本資料の構成は[A]に基づく

    HPCIポータルサイトから入手可能 (http://www.hpci-office.jp/pages/seminar_texts)

    [HW] G. Hager and G. Wellein, Introduction to High Performance Computing for Scientists and Engineers (CRC Press, 2011)

    [S] 寒川光, 藤野清次, 長島利夫, 高橋大介「HPCプログラミング」(オーム社, 2009)

    [UO] 内田啓一郎,小柳滋「コンピュータアーキテクチャ」(オーム社, 2004)

    本資料の主要な参考文献

    2

    他の参考文献は随時記載参照箇所の表記

    [文献記号]:ページ番号 (or 節 or 章, etc.) 例) 経過時間 ([A]:1-2

  • チューニング技法入門: チューニングの基礎

    時間に焦点

    プログラムの実行時間(のどの部分)を「どのようにして、どれだけ削減できるか」に着目 ([A]で貫かれている立場)

    具体例 (モデル) による理解

    チューニング技法 (の一部)の理解: ハードウェアの知識を要求

    本資料: [A]における説明方法に従う

    本質を取り出したモデルで理解 (厳密さは犠牲に)

    より本格的な書籍を理解するための土台の構築

    手を動かす: サンプルコードを準備 (http://www.hpci-office.jp/pages/seminar_tests)

    scalar-sample_YYYYMMDD.tar.gz

    関連するサンプルを本資料内で指示

    前置き: 受講にあたり

    3

  • チューニング技法入門: チューニングの基礎

    本セミナー: Fortran ベースに解説

    C/C++ についても共通事項が多い*

    差異については適宜コメント (例: 配列のデータ格納パターン)

    補足資料 (C版)を提供: プログラム例などをCで記述

    C/C++による科学技術計算コードの書き方 [HW]

    最適化に関するtips

    A. Fog, Optimizing Software in C++: An optimization guide for Windows, Linux and Mac platforms (Sec.7) ; http://www.agner.org/optimize/

    P. Prinz and T. Crawford (黒川利明訳)「Cクイックレファレンス」第2版 (オライリー・ジャパン, 2016) 9章

    テンプレートに関するtips

    D. Vandevoorde, N. M. Josuttis, and D. Gregor, C++ Templates: The Complete Guide 2nd ed. (Addison-Wesley, 2017)

    前置き: C/C++に関する補足情報

    4

    サンプルコード: ET

    *[S]:1章: HPCプログラミングの視点からFortranとC/C++の差異がまとめられている (優劣の議論ではない)

  • チューニング技法入門: チューニングの基礎

    便利な参考書

    基本

    冨田博之「Fortran90プログラミング」(培風館)

    各種Tips

    A. Markus, Modern Fortran in Practice (Cambridge, 2012)

    Fortran Wiki; http://fortranwiki.org/fortran/show/HomePage

    包括的

    M. Metcalf, J. Reid, and M. Chohen, Modern Fortran explained: Incorporating Fortran 2018 (Oxford, 2018)

    前置き: Fortranについて

    5

  • チューニング技法入門: チューニングの基礎

    Part.1: チューニングの基礎

    トピックス:経過時間とCPU時間, ホットスポット, コンパイルオプション(最適化), 時間計測, ホットスポットの特定

    Part.2: キャッシュチューニング

    トッピクス:メモリ階層 (キャッシュの役割), キャッシュ(手早く取れるデータ)の活用, ブロック化

    Part.3: 各種技法の紹介

    トッピクス: ループアンローリング, SIMD処理の利用, 高価な手続きと無駄な計算の削減, 条件分岐への配慮, インライン展開, 数値計算ライブラリの利用

    備考

    各パートの最後にはAppendixが設けられています

    Appendixに関する説明は基本的に省略します

    アウトライン

    6

  • チューニング技法入門: チューニングの基礎

    経過時間

    計算ジョブの開始から実行終了までの時間 (Elapsed time)

    別のジョブが動く場合→ 待ち時間発生→ 経過時間の遅れ

    本資料:「別のジョブが全く動いていない」という設定で考察 ([A]:1-2)

    CPU時間

    ユーザーCPU時間

    ユーザプログラム自体に関するCPUの処理時間

    システムCPU時間

    オペレーティングシステムに関するCPUの処理時間 (入出力割込み,etc.) ([UO]:4章) → 通常はわずか→ 無視可能

    経過時間とCPU時間

    7

    Memo

    ユーザCPU時間とシステムCPU時間を正確に区別することは難しい→ オペレーティングシステムの動作に強く依存*

    * Patterson & Hennessy「コンピュータの構成と設計: ハードウェアとソフトウェアのインタフェース」第5版 (日経BP社) 第1章

  • チューニング技法入門: チューニングの基礎

    I/O時間

    プログラム全体の時間を測定 ([A]:3-1) → 経過時間とCPU時間が一致するとは限らない→ 差をI/O処理の時間と見なす

    [I/O時間] = [経過時間] - [CPU時間] (簡便な経過時間の分析方法)

    ユーザプログラムによるI/O時間

    ファイルや画面への入出力 (結果の書き出し, など)

    経過時間とCPU時間

    8

    Memo

    I/O処理にもCPU時間は必要厳密にI/O時間を取り出そうとは考えないこと

    ページングによるI/O時間の可能性 ([UO]:3章, [A]:6-2)ディスク (スワップ領域)とメモリ間の入出力

    経過時間の「内訳」を意識することが重要問題の切り分け

  • チューニング技法入門: チューニングの基礎

    ホットスポットとは ([A]:1-3, [HW]:2.1節)

    プログラムの実行時間の主要部

    本資料: 「プログラム内でCPU時間を多く消費する部分」と定義→ CPU時間のみに焦点→ 単一のCPU (or コア) 関するチューニング技法

    cf. I/O時間が顕著→ I/Oチューニングの検討(本資料Part.3, [A]:6-1)

    ホットスポットとチューニング

    9

    Case study: 3重ループ最も内側の部分 (処理3) が全体のほとんどを占める→ ホットスポット

    処理1の寄与はわずか → 無視してよい

  • チューニング技法入門: チューニングの基礎

    ホットスポットとは ([A]:1-3, [HW]:2.1節)

    ホットスポットの部分のみをチューニング

    最小の努力で最大の効果を上げる

    ホットスポット以外は触らない

    ホットスポットとチューニング

    10

    Case study: チューニングのターゲットサブルーチンAのCPU時間を0.5倍→ 全体で35%のパフォーマンス向上

    A以外のCPU時間を0.000001倍→ 全体で高々30%のパフォーマンス向上

    パフォーマンス向上の目安

  • チューニング技法入門: チューニングの基礎

    ホットスポットとは ([A]:1-3, [HW]:2.1節)

    ホットスポットの部分のみをチューニング

    最小の努力で最大の効果を上げる

    ホットスポット以外は触らない

    ホットスポットとチューニング

    11

    Memo

    単一のCPU (コア) のみを使用する場合のチューニング→ CPU時間に着目が妥当

    並列計算: コア数が増加するとCPU時間は増大 (by definition)→ 経過時間に着目が妥当 + 計測区間を定める計測区間を定める理由: 経過時間の中で, I/O, 通信, 待ち, 演算等からの寄与を区別

  • チューニング技法入門: チューニングの基礎

    チューニングの手順

    (0) 入力データの準備

    メモリに乗る配列サイズの設定

    計算実行時間の短縮 (例: ステップ数を小さく, 収束条件を緩く, etc.)

    配列サイズ縮小: 好ましくない (ホットスポット変更の可能性)

    (1) ホットスポットの特定 (part.1)

    (2) ホットスポットに対してチューニング

    数値計算ライブラリの利用 (part.3)

    ループにおける配列アクセスパターンの検証 (part.2)

    高価な処理 (除算や組込関数) や無駄な計算の削減 (part.3)

    ループにおけるロード/ストアの削減 (part.3)

    SIMD処理の利用の検討 (part.3)

    (3) 結果が正しいこと, パフォーマンスが向上の有無を確認

    結果の不正 or パフォーマンスの向上不足→ (2)へ戻る

    ホットスポットとチューニング

    12

    (2) ←→ (3)ではバージョン管理を徹底

    参考情報 (RISTの支援活動)高速化ノウハウ集: http://www.hpci-office.jp/pages/tuning_knowhow

  • チューニング技法入門: チューニングの基礎

    最適化のためのオプション

    パフォーマンス向上のための操作(最適化)を指定

    “自動的にチューニング”: 演算順序の変更, 無駄な計算の削減, etc.

    最適化オプションの種類

    “-O” (Optimizeの意味) による指定が多い

    大きい数字→ 最適化レベルの上昇 (例: -O0 < -O1 < -O2 < -O3 )

    コンパイルオプション

    13

    Memo

    最適化の意味と指定法コンパイラに依存 → 詳細はマニュアル (ex. gcc --help=optimizer)

    最適化 → コンパイル時間の増大プログラムの文法エラー修正では”最適化なし”が効率的

    コンパイラが自動的に最適化する → 何故チューニング技法を学ぶか?最適化の内容 (副作用の有無) , 最適化の阻害要因を把握コンパイラを上手に利用する知識

  • チューニング技法入門: チューニングの基礎

    最適化のレベルを高くした場合の副作用 ([A]:2-2)

    計算結果の変化, コンパイラ自体のバグ発生 (誤ったコード生成)

    最適化オプションの指針→「そこそこ」速くて安全

    コンパイルオプション

    14

    Memo

    コンパイラのマニュアルで確認すべき事項最適化オプションの指定と種類デフォルトの最適化オプションの種類 (何も指定しない場合の挙動)最適化レポート (診断レポート) の表示方法

    レポートを上手に使う → チューニング技法習得の近道([HW]:2章)

  • チューニング技法入門: チューニングの基礎

    timeコマンドの使用方法 ([A]:3-1)

    UNIXやLinuxで提供されるコマンド → ジョブ全体の経過時間とCPU時間

    ディスプレイに結果が出力

    Windowsユーザ: Cygwin, MinGW, Bash on Ubuntu on Windows, Docker, etc.

    ジョブ全体のパフォーマンス測定方法

    15

    経過時間ユーザCPU時間システムCPU時間

    Memo

    GNUのtimeコマンド (/usr/bin/time) のマニュアルに依ると(GNU 1.7 ver of time): real %e

    user %U

    sys %S

    %e (Not in tcsh.) Elapsed real time (in seconds).

    %S Total number of CPU-seconds that the process spent in kernel mode.

    %U Total number of CPU-seconds that the process spent in user mode.

  • チューニング技法入門: チューニングの基礎

    経過時間/CPU時間の測定方法

    基本的な考え方: 測定部分の前後で時間を取得→時間の差を計算

    経過時間: SYSTEM_CLOCK (Fortran90で提供)

    CPU時間: CPU_TIME (Fortran95で提供)

    Cのタイマールーチンを呼び出す

    プログラムの一部分のパフォーマンス測定方法

    16

    サンプルコード: timer

    経過時間を測定したい部分

    CPU時間を測定したい部分

  • チューニング技法入門: チューニングの基礎

    経過時間/CPU時間の測定方法

    基本的な考え方: 測定部分の前後で時間を取得→時間の差を計算

    経過時間: SYSTEM_CLOCK (Fortran90で提供)

    CPU時間: CPU_TIME (Fortran95で提供)

    Cのタイマールーチンを呼び出す

    プログラムの一部分のパフォーマンス測定方法

    17

    サンプルコード: timer

    Memo

    タイマーの精度 (resolution): 信頼できる計測時間を把握→ 短すぎる計測時間で性能向上を議論すべきではない

    サンプルコード: timer-res

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ) ([A]:3-6, 3-8, [HW]:2.1節)

    Function profiling: サブルーチン (or 関数) 単位の情報収取

    典型的なツール: gprof (GNUのパッケージの一部)

    ホットスポットの特定方法

    18

    例: Win 10 + MSYS2

    分析結果はgmon.outから取得コンパイル時に「-pg」オプションを付ける

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ) ([A]:3-6, 3-8, [HW]:2.1節)

    Function profiling: サブルーチン (or 関数) 単位の情報収取

    典型的なツール: gprof (GNUのパッケージの一部)

    ホットスポットの特定方法

    19

    Case study: gprofによる性能評価の流れ

    1. コンパイル

    2. 実行・分析

    3. データ取得

    実行後gmon.outが生成

    分析結果をテキストファイルprof.outに書き出し

  • チューニング技法入門: チューニングの基礎

    Flat profile:

    Each sample counts as 0.01 seconds.% cumulative self self totaltime seconds seconds calls us/call us/call name78.55 58.43 58.43 1000000 58.43 58.43 sub3_14.63 69.31 10.88 200000 54.40 288.12 sub2_6.64 74.25 4.94 100001 49.40 166.26 sub1_0.19 74.39 0.14 _mcount_private

    % the percentage of the total running time of thetime program used by this function.

    cumulative a running sum of the number of seconds accountedseconds for by this function and those listed above it.

    self the number of seconds accounted for by thisseconds function alone. This is the major sort for this

    listing.

    ホットスポットを特定するためのツール (プロファイラ) ([A]:3-6, 3-8, [HW]:2.1節)

    Function profiling: サブルーチン (or 関数) 単位の情報収取

    典型的なツール: gprof (GNUのパッケージの一部)

    サブルーチンごとのCPU時間, 呼び出し回数, コールグラフ

    ホットスポットの特定方法

    20

    サンプルコード: timer

    ホットスポット

    0.01秒毎に(関数の使用状況を)サンプリングすることで計測(OSの割り込み機能を利用)

    測定用ルーチンの稼働時間(無視すべき)

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ) ([A]:3-6, 3-8, [HW]:2.1節)

    Function profiling: サブルーチン (or 関数) 単位の情報収取

    典型的なツール: gprof (GNUのパッケージの一部)

    サブルーチンごとのCPU時間, 呼び出し回数, コールグラフ

    ホットスポットの特定方法

    21

    サンプルコード: timer

    Call graph (explanation follows)

    granularity: each sample hit covers 4 byte(s) for 0.01% of 74.39 seconds

    index % time self children called name

    [1] 99.8 0.00 74.25 MAIN__ [1]10.88 46.74 200000/200000 sub2_ [3]4.94 11.69 100000/100001 sub1_ [4]

    -----------------------------------------------11.69 0.00 200000/1000000 sub1_ [4]46.74 0.00 800000/1000000 sub2_ [3]

    [2] 78.5 58.43 0.00 1000000 sub3_ [2]-----------------------------------------------

    10.88 46.74 200000/200000 MAIN__ [1][3] 77.5 10.88 46.74 200000 sub2_ [3]

    46.74 0.00 800000/1000000 sub3_ [2]

    メイン関数の情報mainから呼び出す関数の情報

    sub3の情報sub3から呼び出す関数の情報

    サブルーチン/関数間の関連図を作成したい場合に便利

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ) ([A]:3-6, 3-8, [HW]:2.1節)

    ホットスポットの特定方法

    22

    サンプルコード: timer

    Memo

    Function profiling (gprof など)サブルーチン内のどのline (行) が高コストか, はわからない

    詳細情報を調べたい場合 → オープンソースのツール例 (Linuxの場合)perf (https://perf.wiki.kernel.org/index.php/Tutorial)

    Oprofile (http://oprofile.sourceforge.net/news/)

    ハードウェア情報マシン環境によっては, 収集および分析ツールが提供

    FLOPS, キャッシュミス率,メモリバンド幅, などperfやOprofileでも可能 (アーキテクチャに依存)

    手動でタイマー挿入の意義プロファイラ利用で発生するオーバヘッドが大きい場合は有用評価対象の明確な絞り込み (特定の長いループ, I/O無しのルーチン, 等)

  • チューニング技法入門: チューニングの基礎

    Part.1: チューニングの基礎

    計算の実行時間の内訳を意識する (問題の切り分け)

    [I/O時間]=[経過時間] - [CPU時間]

    ホットスポット・チューニング

    最小の努力で最大の効果

    コンパイラによる最適化を上手に使う

    「そこそこ」速く安全なコンパイルオプションの選択

    パフォーマンスの測定

    タイマーによる時間計測

    プロファイラの利用: ホットスポットの特定に便利

    チューニングの原則: ホットスポット以外は触らない

    まとめ

    23

  • デバッグとコンパイルオプションパフォーマンス測定の考慮点プロファイラについて

    付録

    24

  • チューニング技法入門: チューニングの基礎

    デバッグ時に役に立つオプション ([A]:2-6)

    通常のコンパイル/リンクでエラーにならない問題を検出

    サブルーチンコール間の矛盾, サブルーチンコールの引数不一致

    パフォーマンスは低下→ デバッグ時のみの指定を推奨

    演算例外 ([A]:2-6)

    浮動小数点 (実数) の演算例外

    オーバーフロー, アンダーフロー, ゼロ除算, 無効演算

    演算例外に対する(デフォルトの)対処法→ マシン環境依存

    (1) メッセージを表示して異常終了

    (2) 計算を続行 (結果に文字InfやNaNが表示)*

    コンパイルオプションで(1)に変更可の場合

    パフォーマンスの低下が軽度→ (1) の設定を推奨

    デバッグとコンパイルオプション

    25

    *NaNが発生する場所の特定 (gdbの利用): http://www.ecs.shimane-u.ac.jp/~stamura/NumericalComputation-Tips.html

  • チューニング技法入門: チューニングの基礎

    人工的なプログラムでのパフォーマンス測定 ([A]:3-4)

    典型例: プログラム or サブルーチンの特定部分

    動作確認とパフォーマンスデータ取得

    特定部分のみ抽出→ 適切に計測されない場合 (例: 経過時間がゼロ)

    パフォーマンス測定の考慮点

    26

    Case study: 人工的なコードにおける対策

    Line8: 最初のサブルーチンコールで計算時間が遅くなる可能性を排除

    Line 10: ループ追加により計算時間を長くすることで確実な計測

    Line 14: “スマート”なコンパイラ対策(=不要な計算を削除) のため配列aの使用を「見せかける」(最適化の抑制)

  • チューニング技法入門: チューニングの基礎

    MFLOPSの求め方

    FLOPS (Floating-point Operations Per Second): マシン性能を示す一つの指標

    ハードウェア情報を入手可能なプロファイラで計測可能

    パフォーマンス測定の考慮点

    27

    Case study: 手作業によるループに対するFLOPS の estimation(1) ループ内における浮動小数点演算 (+, - , *) の回数をカウント(2) ループの実行にかかったCPU時間(sec.)をタイマールーチンで計測(3) FLOPS = [ループの反復回数] × [(1)の数値] / [(2)の数値]

    MFLOPS (メガフロップス) → [FLOPS] ×10-6

    GFLOPS (ギガフロップス) → [FLOPS] ×10-12

    注意1: 整数演算のみ → FLOPSはゼロ注意2: 除算(/)も1回としてカウントすることが多い*

    *S. W. Williams, The Roofline Model, in Performance Tuning of Scientific Applications (CRC press).

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ)

    プロファイラについて

    28

    Memo

    gprofのオプション (https://www.ibm.com/developerworks/jp/linux/library/l-gnuprof/index.html)関数ごとのコストのみ表示 (flat): gprof -p コールグラフのみ取得 (call graph): gprof -qコストの注記付きソースを生成 (annotated): gprof -A (cf. gcov)

    perf およびOprofileLinuxカーネルを利用したサンプリングインストールの有無の確認 (例: perf)

    Red Hat, Cent OS: yum list installed |grep -E -i “perf”

    Ubuntu (>14.04): apt list --installed |grep -E -i “perf”

    インストール (システム管理者のみ; 例: Ubuntu) (cf. ソースからコンパイルも可能)perf: sudo apt install linux-tools-common

    Oprofile: sudo apt install oprofile

    使い方perf: B. Gregg 「詳解システム・パフォーマンス」 (オライリー・ジャパン, 2017) 6章Oprofile: 吉岡弘隆他著, DeBug Hacks (オライリー・ジャパン, 2009) 6章

  • チューニング技法入門: チューニングの基礎

    ホットスポットを特定するためのツール (プロファイラ)

    プロファイラについて

    29

    Memo perfの使用例基本: perf record a.outでプログラム実行

    → 統計情報がperf.dataに集約→ perf reportでperf.dataからデータ取得

    サブルーチン毎のコスト (cpu使用率)取得perf record --event=cpu-cycles a.out

    perf report --header -stdio --input=perf.data → 標準出力にデータ出力 (gprofに相当)ユーザのサブルーチンのみのコストの取得

    perf record --event=cpu-cycles:u a.out

    キャッシュミス率の取得perf record --event=cache-misses a.out

    コールグラフの取得perf record --call-graph dwarf a.out

    perf report --stdio --input=perf.data --call-graph

    注釈付き (コスト, 機械語命令) ソースの生成 (要デバッグオプション「-g」)perf annotate --input=perf.data --source --symbol=

    : 対象とするサブルーチン名 (perf reportの出力のSymbol欄に従う)注釈付き (コスト, 機械語命令) ソースの生成 + 高コストの行数表示

    perf annotate --input=perf.data --print-line --source --symbol=

    サンプルコード: prof-ex

  • チューニング技法入門: チューニングの基礎 30

    2018年10月

    一般財団法人高度情報科学技術研究機構 (著作者 )

    本資料を教育目的等で利用いただいて構いません。利用に際しては以下の点に留意いただくとともに、下記のヘルプデスクにお問い合わせ下さい。 本資料は、構成・文章・画像などの全てにおいて著作権法上の保護を受けています。

    本資料の一部あるいは全部について、いかなる方法においても無断での転載・複製を禁じます。

    本資料に記載された内容などは、予告なく変更される場合があります。 本資料に起因して使用者に直接または間接的損害が生じても、著作者はいかなる責任も負わないものとします。

    問い合わせ先:ヘルプデスク helpdesk[-at-]hpci-office.jp([-at-]を@にしてください)

    mailto:helpdesk[-at-]hpci-office.jp