Optimized C++! 最適化の手法集めました

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
連続系アルゴリズム演習 第2回 OpenMPによる課題.
プログラマのレベルアップ.
コンピュータプラクティス I 再現性 水野嘉明
SHA-1の高速化tips 2007/9/15
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
VBA H106077 寺沢友宏.
基礎プログラミングおよび演習 第9回
自作組込みOSを エミュレータで 動かしてみた 坂井弘亮 (KOZOSプロジェクト) Twitter ID:kozossakai.
Lispとは ゲーム理論 minimaxアルゴリズム αβアルゴリズム ソースコードの一部
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
【会議の進め方】会議の定義:問題を解決する場であり情報を共有する場ではない 作成:増永寛之
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
スクリプト言語を用いたPHITSの連続実行
二分探索木によるサーチ.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
静的情報と動的情報を用いた プログラムスライス計算法
図書館職員のための アプリケーション開発講習会
動的スライスを用いた バグ修正前後の実行系列の比較
関数の定義.
マルチスレッド処理 マルチプロセス処理について
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
アルゴリズムとデータ構造1 2006年6月16日
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
アルゴリズムとプログラミング (Algorithms and Programming)
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
04: 式・条件分岐 (if) C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
第5回放送授業.
シリーズ:著者の回答  質問 (韓国 K社、L.Y氏 開発・設計 )
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
プログラミング 4 探索と計算量.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
コンパイラ 2011年10月20日
コンパイラ 2012年10月1日
基礎プログラミング演習 第6回.
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
プログラミング入門 電卓を作ろう・パートI!!.
ウェブデザイン演習 第6回.
C#プログラミング実習 第2回.
ネットワーク・プログラミング デバイスドライバと環境変数.
高度プログラミング演習 (11).
第2章 printf(“変数と入力”); scanf(“%d”,&num);
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
C言語講座 四則演算  if ,  switch 制御文.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング論 バイナリーサーチ 1.
情報処理技法(Javaプログラミング)1 第8回 同じ処理を何回も繰り返すには?
Presentation transcript:

Optimized C++! 最適化の手法集めました Haruka Sao Microsoft MVP for Windows Development Japan MVP Community Connection 2017 Autumn 2017/11/12 Sun

@hr_sao Microsoft MVP for Windows Development [2010-2017] ebisu_optimized.cpp 2017/3/31-11/9

今年2017年2月最適化だけを考えた書籍が日本語で出版! ディスカッション会を隔週で開催 で、実際、この内容どうよ?話を参加者と共有 書籍を元に、さまざまなバックボーンの人たちと話し合う

最適化について考える機会 とにかく実行速度を早くしてくれと言われた なんとなく処理に時間がかかってる気がする そもそも最適化するのが好き(?)

Agenda プログラムを書き始める前に知るべきこと 最適化をする直前に考えること 最適化を実施する時のこと 最適化技法例

プログラムを書き始める前に知るべきこと

速いプログラムは正しいってこと 色んな意見がありますが 「結果的に高速に動くプログラムが良い」 に決まってる →低性能はバグと同じ ただし…  →低性能はバグと同じ ただし… いつでもどこでも最適化して良いんです!

してはいけない事や間違った思い込み1 アセンブラやC言語で書き直す C++の方が速い 手書きには限界がある

してはいけない事や間違った思い込み2 良くないアルゴリズムを最適化する 最初から良いアルゴリズム/ライブラリを採用しよう もう既に先駆者がいてます 後から最適化する →例えば構造化の最適化などは後から無理

してはいけない事や間違った思い込み3 ホットじゃない箇所を必死に最適化する 雰囲気でボトルネックを探す 実験、計測が全て 直感だけで最適化に時間をかけないこと

最適化をする直前に 考えること

最適化しないといけないなと思った時… 計測することだけが 最適化の効果があり!を証明できる 計測する、コストを見積もる どこが、どこまで速くなればいいのか決める 最適化の前後で計測する 30%くらいは速くなるもんらしいです

最適化を実施する時のこと

C++で最適化出来る箇所 文字列 アルゴリズム 動的変数割り当て ホットな文 ライブラリ 探索と整列 データ構造 I/O 並行性 メモリ管理 計測後に、取り組む順番も大事… 効果的だと一般的に思われている順番

std::vector,deque,list,map 文字列 アルゴリズム 動的変数割り当て ホットな文 ライブラリ そもそもコピーが多い 探索と整列 データ構造 I/O 並行性 メモリ管理 アルゴリズムとデータ構造 桁違いに速くなる std::vector,deque,list,map お金があるから使うのと同じ 標準だけでは無理 loop, function 標準だけでは無理 何でも出来る人は要らない マジで自作する気? 3. ライブラリ作者なら、Move semanticsを使ったり、不要なクラスコピーの禁止、関数呼び出しを減らす 4. 地味にdo-while()で判定を一回減らす、++i , 乗算をシフトと加算に書き換える、などあるけど、低レベルな技法をするくらいならコンパイラの方が賢いのであまり役に立たない  そもそも呼び出し回数を減らす、使ってないvirtualを取り除くなど 6. ハッシュテーブルサイコーじゃないし 8. 外界との唯一のつながりがfile, OS固有のものに頼るしかない 9. 標準にはプロセスの概念はない(11でようやくスレッド入った)標準では無理, std::threadよりasyncとかあるけど、優先順位もつけられないスレッドとか…( ;∀;)、ロックフリープログラムもコストに見合う速度が得られるかどうか… 10.Newとかアロケータに手を入れる前にすべきことがある

最適化技法例

ホットスポットの調べ方 みんなどうやって調べてるの? プロファイラ ブロック単位で速度計測 VSでF10で実行していって遅い箇所 適当にBreakして最初に止まった箇所 ホットな文は10%程度といわれる

ここがホントにボトルネックって、設計を疑った方が… If - else if –elseの書き順 最初に if(true)になるなら、if-else ifで書く (switch caseよりも) →CPUのコンパイル分岐予測で if(true) を予測する(ものもある)ため ここがホントにボトルネックって、設計を疑った方が…

ROV確認は…コンストラクタにログ仕込むか… 右辺値参照の関数戻り値はやめよう RVOの最適化にまかせた方が良い 変にreturnでstd::move書いて、move失敗したら、copyが走るor落ちるのでマジデ良くない std::vector<int> && test(){ std::vector<int> vec; return std::move(vec); } ちょっとだけC++っぽい話も return-value-optimization コンパイラの最適化とかに任せたほうが良い ROV確認は…コンストラクタにログ仕込むか…

C++AMPは…ごめん(ここんとこcuda大人気) 並行処理は標準だけで頑張るな 記述コストが高すぎる…(C++17 parallelに期待?) Boost.Thread TBB (計算だけならおススメ) openBLAS, Eigen (高機能な数値計算) TBB:インテル Cuda:NVIDIA C++AMPは…ごめん(ここんとこcuda大人気)

Summary

Summary 最適化プロセス 正しいプログラムを書く 測定する 目標を決める 最適化する 測定結果を調べる

https://ebisu-effective-modern-cpp.connpass.com/ 次回勉強会 2017/11/29(水)~開始! 数回予定(#^.^#) C++14の復習 C++17の予習(言語系, ライブラリ系) https://ebisu-effective-modern-cpp.connpass.com/