SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
.
    GHC へのプログラム変換パスの
.
            追加

          日比野 啓


          2012-09-29



                       .   .   .   .   .   .
今日の話




       .   .   .   .   .   .
今日の話




       .   .   .   .   .   .
Haskell から Core へ


  module Foo ( f ) where

  f :: Int -> Int -> Int
  f x y = x * (x + y)


  Haskell を Core 形式へ変換し、出力するコマンド
  % ghc -c -ddump-simpl Foo.hs



                           .   .   .   .   .   .
Haskell から Core へ
  Foo . f :: GHC . Types . Int -> GHC . Types . Int ->
               GHC . Types . Int
  [ GblId , Arity =2]
  Foo . f =
      ( x_a9H :: GHC . Types . Int )
        ( y_a9I :: GHC . Types . Int ) ->
        GHC . Num .*
           @ GHC . Types . Int
           GHC . Num . $fNumInt
           x_a9H
           ( GHC . Num .+
               @ GHC . Types . Int GHC . Num . $fNumInt
               x_a9H y_a9I )


 Core は GHC が内部で利用している Lambda 式     .   .   .   .   .     .
Core から Core へ




                 .   .   .   .   .   .
Core から Core へ


 Lambda 式を変換すれば、 GHC でプログラム変換
 が書ける。主に最適化のパスを実装する目的で利
 用されているらしい
    compiler/simplCore 以下に変換パスの定義
    compiler/coreSyn 以下に Core の定義や変換用
    ライブラリ




                         .   .   .   .   .   .
simpl の変換パスの追加




 例えば foo というパスを追加する




                      .   .   .   .   .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/simplCore/Foo.lhs:
 module Foo ( fooProgram ) where

 import CoreSyn ( CoreProgram )

 fooProgram :: CoreProgram -> CoreProgram
 ...




                               .   .   .   .   .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/simplCore/Foo.hs:
 module Foo ( fooProgram ) where

 import CoreSyn ( CoreProgram )

 fooProgram :: CoreProgram -> CoreProgram
 fooProgram = id




                              .    .   .   .   .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/simplCore/CoreMonad.lhs

 data CoreToDo ...

   ...
   | CoreFoo
   ...




                                .   .   .   .   .   .
simpl の変換パスの追加
 変換パス foo の追加

 compiler/man/DynFlags.hs
 data DynFlag
    ...
    -- optimisation opts
    ...
    | Opt_Foo
    ...
 fFlags = [
   ...
   ( " foo " , Opt_Foo , nop ) ,
   ... ]

                                   .   .   .   .   .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/coreSyn/SimpleCore.lhs
 ...
 getCoreToDo
   ...
   where
     ...
     strictness = dopt Opt_Strictness              dflags
     ...
     foo        = dopt Opt_foo                     dflags
     ...

                                   .   .   .   .    .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/coreSyn/SimpleCore.lhs
 ...
 getCoreToDo
   ...
   [ ...
     runWhen strictness ... ,
     ...
     runWhen foo CoreFoo ,
     ...
   ]

                                   .   .   .   .   .   .
simpl の変換パスの追加

 変換パス foo の追加

 compiler/coreSyn/SimpleCore.lhs
 import Foo ( fooProgram )
 ...
 doCorePass :: CoreToDo -> ...
 ...
 doCorePass CoreFoo = doPass fooProgram
 ...




                                   .   .   .   .   .   .
simpl の変換パスの追加


 変換パス foo の追加

   ここまでの変更で、コンパイラに       -O1 -ffoo
   スイッチを与えれば、 Foo (fooProgram) でプ
   ログラムが変換されるようになっている
   はず。
   あとは Foo.hs を実装すればよい



                      .   .   .   .   .   .
利用できるライブラリ

 外部ライブラリと同じものでは
   ex. -package Cabal-1.14.0 -package
   array-0.4.0.0 -package base-4.5.0.0 -package
   bin-package-db-0.0.0.0 -package
   bytestring-0.9.2.1 -package containers-0.4.2.1
   -package directory-1.1.0.2 -package
   filepath-1.3.0.0 -package hoopl-3.8.7.3
   -package hpc-0.5.1.1 -package old-time-1.1.0.0
   -package process-1.1.0.1 -package unix-2.5.1.0


                                .   .   .   .   .   .
利用できるライブラリ



 コンパイラ内部だと
   TrieMap(CoreMap)
        CoreExpr を key とした Map
    CoreSubst(Subst)
        Core Syntax を置換するためのデータ構造




                                 .   .   .   .   .   .
実装されている最適化パスの例



 CSE (Common SubExpression Elimination)
     -O1 -fcse
     PRE (Partial redundancy elimination) とも
     式の字面で判断して共通式を除去




                                .   .   .   .   .   .
CSE


      x = p   + q
      y = p   + q
      -- ↓
      x = p   + q   -- Map p + q = > x
      y = p   + q   -- 置き換え対象
      -- ↓
      x = p   + q   -- Map   p + q => x
      y = x




                                  .   .   .   .   .   .
CSE

      r = p
      s = q
      x = p   + q
      y = r   + s
      -- ↓
      r = p
      s = q
      x = p   + q   -- Map p + q = > x
      y = r   + s   -- Map r + s = > y
                    -- 置き換え対象が無い



                                 .   .   .   .   .   .
自分でも最適化パスを追加してみまし
た



 GVN (Global value numbering)
     式が生成する値ごとに異なる番号を付けてい
     き、同じ番号の付いた式を除去する




                                .   .   .   .   .   .
GVN



  -- p ,   q は自由変数
  r = p
  s = q
  x = p    + q
  y = r    + s
  z = x    * y




                     .   .   .   .   .   .
GVN

  z = x * y -- 略
  -- hash [r + s] = hplus [ hash [r],
  --                        hash [+] ,
  --                        hash [s ]]
  --              -- p = > 1, (+) = > 2, q = > 3,
  --              -- r = > 1, s = > 3
  --              = hplus [ 1, 2, 3]
  --              = 123
  -- この例では例えば         123 になったとしておく
  y = r + s -- y = > 123
  x = p + q -- x = > 123
  s = q      -- s = > 2, q = > 2
  r = p      -- r = > 1, r = > 1

                             .   .   .   .   .   .
GVN


  y   =   r + s -- y   =>   123
  x   =   p + q -- x   =>   123
  s   =   q     -- s   =>   2, q = > 2
  r   =   p     -- r   =>   1, r = > 1

  -- 1:   r == > p
  -- 2:   s == > q
  -- 123: y == > x




                                    .    .   .   .   .   .
GVN


  -- 1:   r == > p
  -- 2:   s == > q
  -- 123: y == > x

  r   =   p     --   変化なし          -- 除去可能
  s   =   q     --   変化なし          -- 除去可能
  x   =   p + q --   変化なし
  y   =   p + q --   <-- y = r +   s -- 除去可能
  z   =   x * x --   <-- z = x *   y




                                   .   .   .   .   .   .
デモ




 デモ


      .   .   .   .   .   .
まとめ


  Lambda 式 Core の変換でプログラム変換を実
  装できる
  ライブラリも結構使えるので書きやすい
  GVN を実装してみた。が不完全なのでもう
  ちょっとがんばりたい
  Compiler plugin 化もしてみたい




                   .   .   .   .   .   .

Mais conteúdo relacionado

Mais procurados

diffの真髄
diffの真髄diffの真髄
diffの真髄fuku68
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続7shi
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会7shi
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1Takuya Ueda
 
プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介Kentaro Iizuka
 
スクリプトで文字コード変換
スクリプトで文字コード変換スクリプトで文字コード変換
スクリプトで文字コード変換1000 VICKY
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義するblackenedgold
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたblackenedgold
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」Hiro H.
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングsatoshimurakumo
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic BindingYouyou Cong
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3kAtsuo Ishimoto
 

Mais procurados (20)

diffの真髄
diffの真髄diffの真髄
diffの真髄
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
V6でJIT・部分適用・継続
V6でJIT・部分適用・継続V6でJIT・部分適用・継続
V6でJIT・部分適用・継続
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1
 
プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
スクリプトで文字コード変換
スクリプトで文字コード変換スクリプトで文字コード変換
スクリプトで文字コード変換
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみたReal World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
 
F#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミングF#とC#で見る関数志向プログラミング
F#とC#で見る関数志向プログラミング
 
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic Binding
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3k
 

Destaque

Museo de antequera
Museo de antequeraMuseo de antequera
Museo de antequerapalomatq
 
Lazy Pairing Heap
Lazy Pairing HeapLazy Pairing Heap
Lazy Pairing HeapKei Hibino
 
Profunctor and Arrow
Profunctor and ArrowProfunctor and Arrow
Profunctor and ArrowKei Hibino
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionIn a Rocket
 

Destaque (8)

Html5 101
Html5 101Html5 101
Html5 101
 
Html5 101
Html5 101Html5 101
Html5 101
 
Museo de antequera
Museo de antequeraMuseo de antequera
Museo de antequera
 
Lazy Pairing Heap
Lazy Pairing HeapLazy Pairing Heap
Lazy Pairing Heap
 
HaskellDB
HaskellDBHaskellDB
HaskellDB
 
Profunctor and Arrow
Profunctor and ArrowProfunctor and Arrow
Profunctor and Arrow
 
Html5 101
Html5 101Html5 101
Html5 101
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 

Semelhante a Adding simpl GVN path into GHC

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_optionsnyaocat
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPUgos-k
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
Pgunconf14 pg13-psql
Pgunconf14 pg13-psqlPgunconf14 pg13-psql
Pgunconf14 pg13-psqlToshi Harada
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Etsuji Nakai
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活Masaki Tsuda
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
Material
MaterialMaterial
Material_TUNE_
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章aomori ringo
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10Shin Ise
 

Semelhante a Adding simpl GVN path into GHC (20)

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
Pgunconf14 pg13-psql
Pgunconf14 pg13-psqlPgunconf14 pg13-psql
Pgunconf14 pg13-psql
 
Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料Haskell勉強会 14.1〜14.3 の説明資料
Haskell勉強会 14.1〜14.3 の説明資料
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
Material
MaterialMaterial
Material
 
すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章すごいHaskell楽しく学ぼう 第6章
すごいHaskell楽しく学ぼう 第6章
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10
 

Último

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 

Último (10)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Adding simpl GVN path into GHC

  • 1. . GHC へのプログラム変換パスの . 追加 日比野 啓 2012-09-29 . . . . . .
  • 2. 今日の話 . . . . . .
  • 3. 今日の話 . . . . . .
  • 4. Haskell から Core へ module Foo ( f ) where f :: Int -> Int -> Int f x y = x * (x + y) Haskell を Core 形式へ変換し、出力するコマンド % ghc -c -ddump-simpl Foo.hs . . . . . .
  • 5. Haskell から Core へ Foo . f :: GHC . Types . Int -> GHC . Types . Int -> GHC . Types . Int [ GblId , Arity =2] Foo . f = ( x_a9H :: GHC . Types . Int ) ( y_a9I :: GHC . Types . Int ) -> GHC . Num .* @ GHC . Types . Int GHC . Num . $fNumInt x_a9H ( GHC . Num .+ @ GHC . Types . Int GHC . Num . $fNumInt x_a9H y_a9I ) Core は GHC が内部で利用している Lambda 式 . . . . . .
  • 6. Core から Core へ . . . . . .
  • 7. Core から Core へ Lambda 式を変換すれば、 GHC でプログラム変換 が書ける。主に最適化のパスを実装する目的で利 用されているらしい compiler/simplCore 以下に変換パスの定義 compiler/coreSyn 以下に Core の定義や変換用 ライブラリ . . . . . .
  • 8. simpl の変換パスの追加 例えば foo というパスを追加する . . . . . .
  • 9. simpl の変換パスの追加 変換パス foo の追加 compiler/simplCore/Foo.lhs: module Foo ( fooProgram ) where import CoreSyn ( CoreProgram ) fooProgram :: CoreProgram -> CoreProgram ... . . . . . .
  • 10. simpl の変換パスの追加 変換パス foo の追加 compiler/simplCore/Foo.hs: module Foo ( fooProgram ) where import CoreSyn ( CoreProgram ) fooProgram :: CoreProgram -> CoreProgram fooProgram = id . . . . . .
  • 11. simpl の変換パスの追加 変換パス foo の追加 compiler/simplCore/CoreMonad.lhs data CoreToDo ... ... | CoreFoo ... . . . . . .
  • 12. simpl の変換パスの追加 変換パス foo の追加 compiler/man/DynFlags.hs data DynFlag ... -- optimisation opts ... | Opt_Foo ... fFlags = [ ... ( " foo " , Opt_Foo , nop ) , ... ] . . . . . .
  • 13. simpl の変換パスの追加 変換パス foo の追加 compiler/coreSyn/SimpleCore.lhs ... getCoreToDo ... where ... strictness = dopt Opt_Strictness dflags ... foo = dopt Opt_foo dflags ... . . . . . .
  • 14. simpl の変換パスの追加 変換パス foo の追加 compiler/coreSyn/SimpleCore.lhs ... getCoreToDo ... [ ... runWhen strictness ... , ... runWhen foo CoreFoo , ... ] . . . . . .
  • 15. simpl の変換パスの追加 変換パス foo の追加 compiler/coreSyn/SimpleCore.lhs import Foo ( fooProgram ) ... doCorePass :: CoreToDo -> ... ... doCorePass CoreFoo = doPass fooProgram ... . . . . . .
  • 16. simpl の変換パスの追加 変換パス foo の追加 ここまでの変更で、コンパイラに -O1 -ffoo スイッチを与えれば、 Foo (fooProgram) でプ ログラムが変換されるようになっている はず。 あとは Foo.hs を実装すればよい . . . . . .
  • 17. 利用できるライブラリ 外部ライブラリと同じものでは ex. -package Cabal-1.14.0 -package array-0.4.0.0 -package base-4.5.0.0 -package bin-package-db-0.0.0.0 -package bytestring-0.9.2.1 -package containers-0.4.2.1 -package directory-1.1.0.2 -package filepath-1.3.0.0 -package hoopl-3.8.7.3 -package hpc-0.5.1.1 -package old-time-1.1.0.0 -package process-1.1.0.1 -package unix-2.5.1.0 . . . . . .
  • 18. 利用できるライブラリ コンパイラ内部だと TrieMap(CoreMap) CoreExpr を key とした Map CoreSubst(Subst) Core Syntax を置換するためのデータ構造 . . . . . .
  • 19. 実装されている最適化パスの例 CSE (Common SubExpression Elimination) -O1 -fcse PRE (Partial redundancy elimination) とも 式の字面で判断して共通式を除去 . . . . . .
  • 20. CSE x = p + q y = p + q -- ↓ x = p + q -- Map p + q = > x y = p + q -- 置き換え対象 -- ↓ x = p + q -- Map p + q => x y = x . . . . . .
  • 21. CSE r = p s = q x = p + q y = r + s -- ↓ r = p s = q x = p + q -- Map p + q = > x y = r + s -- Map r + s = > y -- 置き換え対象が無い . . . . . .
  • 22. 自分でも最適化パスを追加してみまし た GVN (Global value numbering) 式が生成する値ごとに異なる番号を付けてい き、同じ番号の付いた式を除去する . . . . . .
  • 23. GVN -- p , q は自由変数 r = p s = q x = p + q y = r + s z = x * y . . . . . .
  • 24. GVN z = x * y -- 略 -- hash [r + s] = hplus [ hash [r], -- hash [+] , -- hash [s ]] -- -- p = > 1, (+) = > 2, q = > 3, -- -- r = > 1, s = > 3 -- = hplus [ 1, 2, 3] -- = 123 -- この例では例えば 123 になったとしておく y = r + s -- y = > 123 x = p + q -- x = > 123 s = q -- s = > 2, q = > 2 r = p -- r = > 1, r = > 1 . . . . . .
  • 25. GVN y = r + s -- y => 123 x = p + q -- x => 123 s = q -- s => 2, q = > 2 r = p -- r => 1, r = > 1 -- 1: r == > p -- 2: s == > q -- 123: y == > x . . . . . .
  • 26. GVN -- 1: r == > p -- 2: s == > q -- 123: y == > x r = p -- 変化なし -- 除去可能 s = q -- 変化なし -- 除去可能 x = p + q -- 変化なし y = p + q -- <-- y = r + s -- 除去可能 z = x * x -- <-- z = x * y . . . . . .
  • 27. デモ デモ . . . . . .
  • 28. まとめ Lambda 式 Core の変換でプログラム変換を実 装できる ライブラリも結構使えるので書きやすい GVN を実装してみた。が不完全なのでもう ちょっとがんばりたい Compiler plugin 化もしてみたい . . . . . .