kiyoka.2014_09_03 RSSPLAIN

Related pages: !kiyoka.blog !kiyoka.blog.list !kiyoka.blog.2014_09
5555555555555555555555555555555555555555555555555555555
5

[LLVM][実験] LLVMが楽しい

5
 LLVM-Logo-Derivative-2
5

 

5

LLVMが普及しつつあるけど実際どうなのか

5

ふと思いついてLLVMについて調べ始めた。

5

世間ではGoogle ChromeのPNaCLとかemscriptenやasm.jsが実用的に使われる気配が見えてきた。

5

AppleのMacOS XやFreeBSDのLLVMへの傾倒を見ると、そろそろどんなものか知りたくなってきた。

5

なぜか昔から自分はCross Platformの話題が好きなようで、i386で動くLinuxのエミュレーターをJavaで書いたこともある。(完全に黒歴史…)

5

 

5

LLVM-IR

5

Cross Platformerとしての興味の対象はLLVM-IREXTなので、まずはここから。

5

LLVM-IRの言語仕様を調べたりclangの出力するLLVM-IRのコードを眺めてみたりした。

5

clangの最適化オプションを -O0 から -O3 にしてどれくらい最適化されるのかを眺めたり。

5

LLVM-IRの抽象度は非常に高く読みやすく(読むものでは無いだろが)Cross Platformな話題が好きな自分にはかなり楽しそう。

5

挙句の果てには、LLVM-IRのコードをEmacsLispで動かせないかと実験をしてみたりした。

5

 

5

LLVM-IRをEmacsLispに翻訳

5

可能性を探るためにちょっとやってみたのだが、LLVM-IRのインタプリタlliコマンド の 約1000倍の実行時間がかかることがわかった。

5

ということでこれで思考実験は終わり。

5

 

5

このようなCプログラムをclangでコンパイルし、LLVM-IRを翻訳したEmacsLispで動かしてみた。

5
#include <stdio.h>
5
5
int main(void)
5
{
5
  int total = 0;
5
  volatile int i;
5
  for( i = 0 ; i < (1000000 * 1000) ; i++ ) {
5
    total += i+1;
5
  }
5
  printf( "total = %d\n", total );
5
  return 0;
5
}
5

 

5

"clang -O0 -S -emit-llvm loop.c" で出力したLLVM-IRコードもあわせて見るにはこちら。

5
 simple loop program.EXT
5

 

5

つぎに愚直にEmacsLispに翻訳してみたのが loop1.el 

5

手でちょっとだけ最適化してみたのが loop2.el 

5
 Translate to Elisp from LLVM-IR codeEXT
5

 

5

LLVM-IRをSchemeに翻訳

5

愚直にSchemeに翻訳してGaucheで動かしてみたのがこちら。

5

lliの100倍の時間がかかる。しかしGaucheは速い。

5
 Translate to Scheme from LLVM-IR codeEXT
5

 

5

cmigemoをEmacsLispで走らせられないか(妄想)

5

cmigemoを1000倍非力なCPUで動かすとどれくらい使えないかを測ってみた。

5

cmigemoの検索クエリから正規表現への展開は1000回実行しても100ms程度で、実用的な範囲。

5

しかし、mcigemoが辞書をロードする時間は1000回実行すると3分もかかる。これは実用にならない。

5

 

5

っと、ここで夢から覚めて我に返った(←イマココ)

5

いやー妄想って楽しいもんです。

5

 

5

...comment disabled...