SlideShare a Scribd company logo
.
    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 化もしてみたい




                   .   .   .   .   .   .

More Related Content

What's hot

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 #1
Takuya Ueda
 
プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介プログラミング言語 Julia の紹介
プログラミング言語 Julia の紹介
Kentaro Iizuka
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
Nobuhisa Koizumi
 
スクリプトで文字コード変換
スクリプトで文字コード変換スクリプトで文字コード変換
スクリプトで文字コード変換
1000 VICKY
 
コルーチンの使い方
コルーチンの使い方コルーチンの使い方
コルーチンの使い方
Naohiro Yoshikawa
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
blackenedgold
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex
 
条件分岐と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
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
 
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 Binding
Youyou Cong
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3k
Atsuo Ishimoto
 

What's hot (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
 

Viewers also liked

Html5 101
Html5 101Html5 101
Html5 101
Mouafa Ahmed
 
Html5 101
Html5 101Html5 101
Html5 101
Mouafa Ahmed
 
Museo de antequera
Museo de antequeraMuseo de antequera
Museo de antequera
palomatq
 
Lazy Pairing Heap
Lazy Pairing HeapLazy Pairing Heap
Lazy Pairing HeapKei Hibino
 
HaskellDB
HaskellDBHaskellDB
HaskellDB
Kei Hibino
 
Profunctor and Arrow
Profunctor and ArrowProfunctor and Arrow
Profunctor and Arrow
Kei Hibino
 
Html5 101
Html5 101Html5 101
Html5 101
Mouafa Ahmed
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
In a Rocket
 

Viewers also liked (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
 

Similar to 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_options
nyaocat
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
bleis tift
 
Common LispでGPGPU
Common LispでGPGPUCommon LispでGPGPU
Common LispでGPGPU
gos-k
 
Applicative functor
Applicative functorApplicative functor
Applicative functor
Yuichi Adachi
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
 
Pgunconf14 pg13-psql
Pgunconf14 pg13-psqlPgunconf14 pg13-psql
Pgunconf14 pg13-psql
Toshi 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 prelerease
Shiqiao Du
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
Masaki Tsuda
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
MITSUNARI Shigeo
 
高速な倍精度指数関数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
 

Similar to 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
 

Recently uploaded

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 

Recently uploaded (10)

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 

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 化もしてみたい . . . . . .