SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
本物の X86Optimizer は
          icc を使う
Outline
1. X86 なら icc だよね!
2. コンパイラと協調した最適化
3. 各種オプションの詳細
                       2011/08/06 X86/X64 最適化勉強会 1
                 nothingcosmos <nothingcosmos@gmail.com>
プロフィール
   HN:nothingcosmos
   コンパイラ屋歴 6 年くらい
    X86 アセンブリプログラミング経験は少なめ
   X86 を最適化する上で、
    コンパイラと上手に付き合うための方法を紹介
   決して Intel の回し者ではありませんので、、
X86 なら ICC だよね!
   Linux 版の IntelCompiler およびライブラリは
    非商用において、無償でつかえる
   Linux 版 URL:http://goo.gl/nOeTP


   今回の資料は、 Intel Composer XE 2011
    最適化クイック・リファレンス・ガイド
    をちょっと掘り下げています。
icc のコンパイルオプション
   Icc に一番速いやつで頼むオプションは、 ­fast
   ­fast = ­xHOST ­O3 ­ipo ­no­prec­div ­static
    xHOST : ホストで最速な命令セットを使用する
    O3       : speed 最優先のアグレッシブな最適化
    ipo      : プロシージャ間の最適化
    no­prec­div: 浮動小数点精度の向上
    static   : 共有ライブラリを使用せず、内部に取り込む
コンパイラと協調した最適化
   コンパイラオプションでチューニングする
          プロシージャ間の最適化
                                      手軽
          プロファイルに基づいた最適化
          きめ細やかなチューニングオプション
   pragma directive 等の使用
   手でボトルネック部分を最適化する
          コンパイラのレポート機能の活用            効果高い
          Vtune などのパフォーマンスアナライザの活用
          SIMD 等のアセンブリプログラミング
コンパイラと協調した最適化
   コンパイラオプションでチューニングする
         プロシージャ間の最適化
                                   手軽
         プロファイルに基づいた最適化
         きめ細やかなチューニングオプション





                 コンパイラ担当なので、
             コンパイラオプションの紹介をします     効果高い
                 ハンドオプティマイズや
           SIMD アセンブリプログラミングなんかは
             他の方が紹介してくれるそうなので
ここからオプションの詳細
   プロシージャ間の最適化 (IPO)
   プロファイルに基づいた最適化 (PBO)
   きめ細やかなチューニングオプション
         ループアンローリング
         ソフトウェアプリフェッチ
         エイリアシング


            既にご存知の方はどのくらい???
プロシージャー間の最適化
   複数ファイルに跨った最適化を有効にする
   複数ファイルのコンパイル時に効果を発揮する
    別ファイルの関数の inline 展開、メモリレイアウトの改善
    別名解析の精度向上、不要なシンボルの除去に伴うプログラムサイズの改善
   複数ファイルをコンパイルする coremark で性能測定
    20297 iterations   ­O3 ­xHOST ­fargument­noalias
    20533 iterations   ­O3 ­xHOST ­fargument­noalias ­ipo
プロシージャー間の最適化
   普通のコンパイルプロセス

    a.c              a.s              a.o

            cc                as               ld        a.out
    b.c              a.s              a.o


   IPO(LTO) のコンパイルプロセス

    a.c              a.il

            cc1               cc2     a.s      as   ld           a.out
    b.c              a.il

   icc は ­ipo を付与すると、 ­o ファイルに __ildata が埋まっている
   gcc は gimple レベル、 llvm は bitcode レベルで行う。

プロシージャー間の最適化
   JVM は必要なクラスを全て取り込んだ状態で JIT コンパイルするので
    プロシージャ間と考え方は同じ。
   積極的に inline 展開や脱仮想化を試行できる
    classloader が上記を阻害するけど、脱最適化と再コンパイルで回避
   IPO や LTO の注意点として
    llvm(­O4, std­link­opts, ­internalize) は、
    1 つの実行ファイルとして仮定して最適化し、シンボルの static 化を行う。
   他からの参照があると、 ld で見つからないことも。。
プロファイルに基づく最適化
   プロファイル情報を使用してさらに高度な最適化を行う
   使うためには、 3 段階の手順が必要
    1. $ icc ­prof­gen ­O0 xxx.c 関数の埋め込み
    2. $ ./a.out                         プロファイル情報の収集
    3. $ icc ­prof­use ­fast xxx.c 最適化を有効化
   Coremark も性能向上。ほんのちょっと。
    19404 iterations   ­fast
    19531 iterations   ­fast ­prof­use
    20567 iterations   ­fast ­fargument­noalias
    21398 iterations   ­fast ­fargument­noalias ­prof­use 4% 性能向上
プロファイルに基づく最適化
         ­prof­gen を指定すると、関数の入口
          出口、分岐に命令を埋め込む
         関数やブロックの実行回数、
          分岐確率等をファイルに記録し、
          最適化に活かすことができる。
         JVM はインタプリタ実行時に取得
         ↓llvm 的にはこんな感じ
プロファイルに基づく最適化
    PGO の利点
   分岐予測の最適化が改善される。マニュアルの 3.4.1
   過度なループ展開、ベクトル化、プリフェッチの抑止
   細かい最適化テクニックを駆使するよりも、
    PGO に任せた方がよい。
   プロファイルのパラメータと異なる場合、性能劣化の可能性
    プロファイル結果に敏感なコンパイラの場合は注意
    icc はあまり劣化するようなことはしないが、
    java ­server コンパイラなんかは積極的に活用します
きめ細かなチューニングオプション
    インテル ComposerXE2011
    最適化クイック・リファレンス・ガイドより
   ­unroll[n]
   ­opt­prefetch[n]
   ­fargument­[no]alias
きめ細かなチューニングオプション
         ­unroll[n]
   ループ展開の最大数 n を指定する。 0 で展開無効化
   ループを n 倍展開すると、様々な恩恵を得て性能向上
    やりすぎると様々なキャッシュがオーバーして性能劣化
                        個人的には、
                        しきい値の調整は PGO に
                        任せればいいんじゃないか
                        と思ってます。
きめ細かなチューニングオプション
         ­unroll[n]
   ループ展開の効果を coremark で測定
    共通オプション ­fast ­fargument­noalias
    20107 iterations   ­unroll0
    20338 iterations   ­unroll2    ←  デフォ
    20519 iterations   ­unroll4
    20761 iterations   ­unroll6    ←  2%程度性能向上
    20435 iterations   ­unroll8    ← 8 倍以上にはアンロールされない
    20422 iterations   ­unr0ll16
    X 86はプロセッサがいろいろ頑張りすぎて、
    アンロールの有効性は少ないかもしれない。
きめ細かなチューニングオプション
         ­unroll[n]
アンロールは最適化リファレンス・マニュアルに 83 回も出てくる重要キーワード
ドキュメントで unroll のトレードオフを熱心に説明するわりに、
内部で heuristics に決めてるらしく、 max パラメータしか指定できない。。
きめ細かなチューニングオプション
        ­opt­prefetch[n]
   自動的に prefetcht0 命令を挿入する最適化
    初期値 n=0 なので、意図的に指定する必要あり
                            PGO では自動的に挿入してくれない

                             無駄な prefetcht0 は削除してくれる


                            openjdk7 ­server  JIT コンパイラは

                             prefetcht0 を自動挿入してくれる
きめ細かなチューニングオプション
        ­opt­prefetch[n]
   姫野ベンチのようなキャッシュ依存のベンチで効果がある
    himenobmtxps.c ­DSMALL ­O3 ­opt­prefetch[n]
    n=0:   5695 MFLOPS
    n=2:   6409 MFLOPS  13% 弱向上
   ただし、挿入しすぎると性能劣化する
    coremark   キャッシュによる影響が少ないベンチマーク
    n=0    19505 iterations prefetcht0 が 0 命令     ­O3
    n=2    19317 iterations prefetcht0 が 21 命令    ­O3 ­opt­prefetch2
    n=4    19157 iterations prefetcht0 が 33 命令    ­O3 ­opt­prefetch4 ­prof­use
    n=4    18359 iterations prefetcht0 が 71 命令    ­O3 ­opt­prefetch4
きめ細かなチューニングオプション
       ­fargument­[no]alias
   別名の有無を制御するためのオプション
    初期値は ­fargument­alias
    別名の制御は一般的に難しいが、 argument は理解しやすい
   一般のコンパイラは、下記に示すポインタ A と B が
    同じものを指す可能性を考慮して最適化する。
きめ細かなチューニングオプション
       ­fargument­[no]alias
   icc で ­fargument­noalias を指定すると、
    最内側ループのベクトル化を促進
   他にも様々な恩恵が
きめ細かなチューニングオプション
       ­fargument­[no]alias
   ­fargument­noalias は restrict みたいなもの
    引数のポインタ同士が同じものを指すことがない
    と仮定させるので、結果不正に注意
                      Aggressive なループ展開と組み合わせると
                       こんな素敵ループが生成される。
                       ベクトル化で速くなるとは限らないけど、、
                      Coremark は ­fargument­noalias で 4% 性能向上
                       19404 iterations   ­fast
                       20174 iterations   ­fast ­fargument­noalias

Más contenido relacionado

La actualidad más candente

【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 sandai
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Hiro Yoshioka
 
PHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件についてPHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件について健治郎 安井
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPNSaitoNmiri
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話nullnilaki
 
Dbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncDbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncKoji Shinkubo
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflowionis111
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」Soudai Sone
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
NetBeansではじめる FuelPHP
NetBeansではじめる FuelPHPNetBeansではじめる FuelPHP
NetBeansではじめる FuelPHPJunichi Yamamoto
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
Stack Buffer OverFlow
Stack Buffer OverFlowStack Buffer OverFlow
Stack Buffer OverFlowsounakano
 
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)hiroshi oshiba
 

La actualidad más candente (20)

【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門 【学習メモ#7th】12ステップで作る組込みOS自作入門
【学習メモ#7th】12ステップで作る組込みOS自作入門
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
PHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件についてPHP buildpackでhackとphalconが動いた件について
PHP buildpackでhackとphalconが動いた件について
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSP
 
Ssaw08 0617
Ssaw08 0617Ssaw08 0617
Ssaw08 0617
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
Dbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_syncDbts2013 特濃jpoug log_file_sync
Dbts2013 特濃jpoug log_file_sync
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Buffer overflow
Buffer overflowBuffer overflow
Buffer overflow
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
NetBeansではじめる FuelPHP
NetBeansではじめる FuelPHPNetBeansではじめる FuelPHP
NetBeansではじめる FuelPHP
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
Stack Buffer OverFlow
Stack Buffer OverFlowStack Buffer OverFlow
Stack Buffer OverFlow
 
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
 

Destacado

x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTtakesako
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算Norishige Fukushima
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesTakeshi Yamamuro
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜Ryoma Sin'ya
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜Ryoma Sin'ya
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
 
77386springrealestatemarketreportsoctober2012 121023082045-phpapp02
77386springrealestatemarketreportsoctober2012 121023082045-phpapp0277386springrealestatemarketreportsoctober2012 121023082045-phpapp02
77386springrealestatemarketreportsoctober2012 121023082045-phpapp02Tanya Lavoie Bugbee
 
Social Media: Fans and followers are an end, not a means
Social Media: Fans and followers are an end, not a meansSocial Media: Fans and followers are an end, not a means
Social Media: Fans and followers are an end, not a meansKantar
 
Eco 202 ch 30 the monetary system
Eco 202 ch 30 the monetary systemEco 202 ch 30 the monetary system
Eco 202 ch 30 the monetary systemGale Pooley
 
9 Habits to Nurture Back Your Health
9 Habits to Nurture Back Your Health9 Habits to Nurture Back Your Health
9 Habits to Nurture Back Your HealthJeffrey Pickett
 
101 lecture 19 earnings and discrimination
101 lecture 19 earnings and discrimination101 lecture 19 earnings and discrimination
101 lecture 19 earnings and discriminationGale Pooley
 
Brand equity: what's price got to do with it?
Brand equity: what's price got to do with it?Brand equity: what's price got to do with it?
Brand equity: what's price got to do with it?Kantar
 

Destacado (20)

x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
 
Popcntによるハミング距離計算
Popcntによるハミング距離計算Popcntによるハミング距離計算
Popcntによるハミング距離計算
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
A x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequencesA x86-optimized rank&select dictionary for bit sequences
A x86-optimized rank&select dictionary for bit sequences
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
 
正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜正規表現に潜む対称性 〜等式公理による等価性判定〜
正規表現に潜む対称性 〜等式公理による等価性判定〜
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
77386springrealestatemarketreportsoctober2012 121023082045-phpapp02
77386springrealestatemarketreportsoctober2012 121023082045-phpapp0277386springrealestatemarketreportsoctober2012 121023082045-phpapp02
77386springrealestatemarketreportsoctober2012 121023082045-phpapp02
 
Final powerpoint
Final powerpointFinal powerpoint
Final powerpoint
 
Social Media: Fans and followers are an end, not a means
Social Media: Fans and followers are an end, not a meansSocial Media: Fans and followers are an end, not a means
Social Media: Fans and followers are an end, not a means
 
Eco 202 ch 30 the monetary system
Eco 202 ch 30 the monetary systemEco 202 ch 30 the monetary system
Eco 202 ch 30 the monetary system
 
9 Habits to Nurture Back Your Health
9 Habits to Nurture Back Your Health9 Habits to Nurture Back Your Health
9 Habits to Nurture Back Your Health
 
Colors
ColorsColors
Colors
 
101 lecture 11
101 lecture 11101 lecture 11
101 lecture 11
 
310 lecture 6
310 lecture 6310 lecture 6
310 lecture 6
 
101 lecture 19 earnings and discrimination
101 lecture 19 earnings and discrimination101 lecture 19 earnings and discrimination
101 lecture 19 earnings and discrimination
 
Brand equity: what's price got to do with it?
Brand equity: what's price got to do with it?Brand equity: what's price got to do with it?
Brand equity: what's price got to do with it?
 
Dhvm 2.0
Dhvm 2.0Dhvm 2.0
Dhvm 2.0
 

Similar a X86opti01 nothingcosmos

LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122nothingcosmos
 
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介Tamakoshi Hironori
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説Shoken Fujisaki
 
Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Toshihiro Araki
 
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...Insight Technology, Inc.
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...エピック・ゲームズ・ジャパン Epic Games Japan
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)Mr. Vengineer
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Yuichiro Saito
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1Y Watanabe
 
MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索yoyamasaki
 
プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~ryouta watabe
 
Benchmark during different architecture cloud IBM z Systems vs Intel Xeon
Benchmark during   different architecture cloud  IBM z Systems vs Intel XeonBenchmark during   different architecture cloud  IBM z Systems vs Intel Xeon
Benchmark during different architecture cloud IBM z Systems vs Intel XeonHirofumi Nakata
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Yoshinori Matsunobu
 
TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門tak9029
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworkstripodworks
 

Similar a X86opti01 nothingcosmos (20)

LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介
多言語を一つの処理系でハイパフォーマンスに実行するGraalPythonの紹介
 
UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
MongoDB Configパラメータ解説
MongoDB Configパラメータ解説MongoDB Configパラメータ解説
MongoDB Configパラメータ解説
 
Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話 Machine configoperatorのちょっとイイかもしれない話
Machine configoperatorのちょっとイイかもしれない話
 
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...
[db tech showcase Tokyo 2018] #dbts2018 #D15 『5年連続!第三者機関の評価で(圧倒的)最強のピュアストレージが...
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
 
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
 
Froyo DalvikVM JIT
Froyo DalvikVM JITFroyo DalvikVM JIT
Froyo DalvikVM JIT
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節Principles of Transaction Processing Second Edition 9章 4~9節
Principles of Transaction Processing Second Edition 9章 4~9節
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
 
MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索MySQL 5.7 InnoDB 日本語全文検索
MySQL 5.7 InnoDB 日本語全文検索
 
プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~プロとしてのOracleアーキテクチャ入門 ~番外編~
プロとしてのOracleアーキテクチャ入門 ~番外編~
 
Benchmark during different architecture cloud IBM z Systems vs Intel Xeon
Benchmark during   different architecture cloud  IBM z Systems vs Intel XeonBenchmark during   different architecture cloud  IBM z Systems vs Intel Xeon
Benchmark during different architecture cloud IBM z Systems vs Intel Xeon
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門
 
Linux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworksLinux Kernel Seminar in tripodworks
Linux Kernel Seminar in tripodworks
 

Más de nothingcosmos

2014 dart flight school in Tokyo
2014 dart flight school in Tokyo2014 dart flight school in Tokyo
2014 dart flight school in Tokyonothingcosmos
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compilernothingcosmos
 
OpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler OverviewOpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler Overviewnothingcosmos
 

Más de nothingcosmos (7)

2014 dart flight school in Tokyo
2014 dart flight school in Tokyo2014 dart flight school in Tokyo
2014 dart flight school in Tokyo
 
Dart 1.1
Dart 1.1Dart 1.1
Dart 1.1
 
Source Code of Dart
Source Code of DartSource Code of Dart
Source Code of Dart
 
Dart VM Performance
Dart VM PerformanceDart VM Performance
Dart VM Performance
 
DartVM on Android
DartVM on AndroidDartVM on Android
DartVM on Android
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
OpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler OverviewOpenJDK HotSpot C1Compiler Overview
OpenJDK HotSpot C1Compiler Overview
 

X86opti01 nothingcosmos

  • 1. 本物の X86Optimizer は icc を使う Outline 1. X86 なら icc だよね! 2. コンパイラと協調した最適化 3. 各種オプションの詳細 2011/08/06 X86/X64 最適化勉強会 1 nothingcosmos <nothingcosmos@gmail.com>
  • 2. プロフィール  HN:nothingcosmos  コンパイラ屋歴 6 年くらい X86 アセンブリプログラミング経験は少なめ  X86 を最適化する上で、 コンパイラと上手に付き合うための方法を紹介  決して Intel の回し者ではありませんので、、
  • 3. X86 なら ICC だよね!  Linux 版の IntelCompiler およびライブラリは 非商用において、無償でつかえる  Linux 版 URL:http://goo.gl/nOeTP  今回の資料は、 Intel Composer XE 2011 最適化クイック・リファレンス・ガイド をちょっと掘り下げています。
  • 4. icc のコンパイルオプション  Icc に一番速いやつで頼むオプションは、 ­fast  ­fast = ­xHOST ­O3 ­ipo ­no­prec­div ­static xHOST : ホストで最速な命令セットを使用する O3 : speed 最優先のアグレッシブな最適化 ipo : プロシージャ間の最適化 no­prec­div: 浮動小数点精度の向上 static : 共有ライブラリを使用せず、内部に取り込む
  • 5. コンパイラと協調した最適化  コンパイラオプションでチューニングする  プロシージャ間の最適化 手軽  プロファイルに基づいた最適化  きめ細やかなチューニングオプション  pragma directive 等の使用  手でボトルネック部分を最適化する  コンパイラのレポート機能の活用 効果高い  Vtune などのパフォーマンスアナライザの活用  SIMD 等のアセンブリプログラミング
  • 6. コンパイラと協調した最適化  コンパイラオプションでチューニングする  プロシージャ間の最適化 手軽  プロファイルに基づいた最適化  きめ細やかなチューニングオプション  コンパイラ担当なので、 コンパイラオプションの紹介をします 効果高い ハンドオプティマイズや SIMD アセンブリプログラミングなんかは 他の方が紹介してくれるそうなので
  • 7. ここからオプションの詳細  プロシージャ間の最適化 (IPO)  プロファイルに基づいた最適化 (PBO)  きめ細やかなチューニングオプション  ループアンローリング  ソフトウェアプリフェッチ  エイリアシング 既にご存知の方はどのくらい???
  • 8. プロシージャー間の最適化  複数ファイルに跨った最適化を有効にする  複数ファイルのコンパイル時に効果を発揮する 別ファイルの関数の inline 展開、メモリレイアウトの改善 別名解析の精度向上、不要なシンボルの除去に伴うプログラムサイズの改善  複数ファイルをコンパイルする coremark で性能測定 20297 iterations ­O3 ­xHOST ­fargument­noalias 20533 iterations ­O3 ­xHOST ­fargument­noalias ­ipo
  • 9. プロシージャー間の最適化  普通のコンパイルプロセス a.c a.s a.o cc as ld a.out b.c a.s a.o  IPO(LTO) のコンパイルプロセス a.c a.il cc1 cc2 a.s as ld a.out b.c a.il  icc は ­ipo を付与すると、 ­o ファイルに __ildata が埋まっている  gcc は gimple レベル、 llvm は bitcode レベルで行う。 
  • 10. プロシージャー間の最適化  JVM は必要なクラスを全て取り込んだ状態で JIT コンパイルするので プロシージャ間と考え方は同じ。  積極的に inline 展開や脱仮想化を試行できる classloader が上記を阻害するけど、脱最適化と再コンパイルで回避  IPO や LTO の注意点として llvm(­O4, std­link­opts, ­internalize) は、 1 つの実行ファイルとして仮定して最適化し、シンボルの static 化を行う。  他からの参照があると、 ld で見つからないことも。。
  • 11. プロファイルに基づく最適化  プロファイル情報を使用してさらに高度な最適化を行う  使うためには、 3 段階の手順が必要 1. $ icc ­prof­gen ­O0 xxx.c 関数の埋め込み 2. $ ./a.out プロファイル情報の収集 3. $ icc ­prof­use ­fast xxx.c 最適化を有効化  Coremark も性能向上。ほんのちょっと。 19404 iterations ­fast 19531 iterations ­fast ­prof­use 20567 iterations ­fast ­fargument­noalias 21398 iterations ­fast ­fargument­noalias ­prof­use 4% 性能向上
  • 12. プロファイルに基づく最適化  ­prof­gen を指定すると、関数の入口 出口、分岐に命令を埋め込む  関数やブロックの実行回数、 分岐確率等をファイルに記録し、 最適化に活かすことができる。  JVM はインタプリタ実行時に取得  ↓llvm 的にはこんな感じ
  • 13. プロファイルに基づく最適化 PGO の利点  分岐予測の最適化が改善される。マニュアルの 3.4.1  過度なループ展開、ベクトル化、プリフェッチの抑止  細かい最適化テクニックを駆使するよりも、 PGO に任せた方がよい。  プロファイルのパラメータと異なる場合、性能劣化の可能性 プロファイル結果に敏感なコンパイラの場合は注意 icc はあまり劣化するようなことはしないが、 java ­server コンパイラなんかは積極的に活用します
  • 14. きめ細かなチューニングオプション インテル ComposerXE2011 最適化クイック・リファレンス・ガイドより  ­unroll[n]  ­opt­prefetch[n]  ­fargument­[no]alias
  • 15. きめ細かなチューニングオプション ­unroll[n]  ループ展開の最大数 n を指定する。 0 で展開無効化  ループを n 倍展開すると、様々な恩恵を得て性能向上 やりすぎると様々なキャッシュがオーバーして性能劣化 個人的には、 しきい値の調整は PGO に 任せればいいんじゃないか と思ってます。
  • 16. きめ細かなチューニングオプション ­unroll[n]  ループ展開の効果を coremark で測定 共通オプション ­fast ­fargument­noalias 20107 iterations ­unroll0 20338 iterations ­unroll2 ←  デフォ 20519 iterations ­unroll4 20761 iterations ­unroll6  ←  2%程度性能向上 20435 iterations ­unroll8 ← 8 倍以上にはアンロールされない 20422 iterations ­unr0ll16 X 86はプロセッサがいろいろ頑張りすぎて、 アンロールの有効性は少ないかもしれない。
  • 17. きめ細かなチューニングオプション ­unroll[n] アンロールは最適化リファレンス・マニュアルに 83 回も出てくる重要キーワード ドキュメントで unroll のトレードオフを熱心に説明するわりに、 内部で heuristics に決めてるらしく、 max パラメータしか指定できない。。
  • 18. きめ細かなチューニングオプション ­opt­prefetch[n]  自動的に prefetcht0 命令を挿入する最適化 初期値 n=0 なので、意図的に指定する必要あり  PGO では自動的に挿入してくれない 無駄な prefetcht0 は削除してくれる  openjdk7 ­server  JIT コンパイラは prefetcht0 を自動挿入してくれる
  • 19. きめ細かなチューニングオプション ­opt­prefetch[n]  姫野ベンチのようなキャッシュ依存のベンチで効果がある himenobmtxps.c ­DSMALL ­O3 ­opt­prefetch[n] n=0: 5695 MFLOPS n=2: 6409 MFLOPS  13% 弱向上  ただし、挿入しすぎると性能劣化する coremark   キャッシュによる影響が少ないベンチマーク n=0 19505 iterations prefetcht0 が 0 命令 ­O3 n=2 19317 iterations prefetcht0 が 21 命令 ­O3 ­opt­prefetch2 n=4 19157 iterations prefetcht0 が 33 命令 ­O3 ­opt­prefetch4 ­prof­use n=4  18359 iterations prefetcht0 が 71 命令 ­O3 ­opt­prefetch4
  • 20. きめ細かなチューニングオプション ­fargument­[no]alias  別名の有無を制御するためのオプション 初期値は ­fargument­alias 別名の制御は一般的に難しいが、 argument は理解しやすい  一般のコンパイラは、下記に示すポインタ A と B が 同じものを指す可能性を考慮して最適化する。
  • 21. きめ細かなチューニングオプション ­fargument­[no]alias  icc で ­fargument­noalias を指定すると、 最内側ループのベクトル化を促進  他にも様々な恩恵が
  • 22. きめ細かなチューニングオプション ­fargument­[no]alias  ­fargument­noalias は restrict みたいなもの 引数のポインタ同士が同じものを指すことがない と仮定させるので、結果不正に注意  Aggressive なループ展開と組み合わせると こんな素敵ループが生成される。 ベクトル化で速くなるとは限らないけど、、  Coremark は ­fargument­noalias で 4% 性能向上 19404 iterations ­fast 20174 iterations ­fast ­fargument­noalias