kiyokaのブログアーカイブ

Archive of old blog posts

LLVMが楽しい

img

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

ふと思いついてLLVMについて調べ始めた。 世間ではGoogle ChromeのPNaCLとかemscriptenやasm.jsが実用的に使われる気配が見えてきた。 AppleのMacOS XやFreeBSDのLLVMへの傾倒を見ると、そろそろどんなものか知りたくなってきた。 なぜか昔から自分はCross Platformの話題が好きなようで、i386で動くLinuxのエミュレーターをJavaで書いたこともある。(完全に黒歴史…)

LLVM-IR

Cross Platformerとしての興味の対象はLLVM-IRなので、まずはここから。 LLVM-IRの言語仕様を調べたりclangの出力するLLVM-IRのコードを眺めてみたりした。 clangの最適化オプションを -O0 から -O3 にしてどれくらい最適化されるのかを眺めたり。 LLVM-IRの抽象度は非常に高く読みやすく(読むものでは無いだろが)Cross Platformな話題が好きな自分にはかなり楽しそう。 挙句の果てには、LLVM-IRのコードをEmacsLispで動かせないかと実験をしてみたりした。

LLVM-IRをEmacsLispに翻訳

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

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

#include <stdio.h>

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

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

つぎに愚直にEmacsLispに翻訳してみたのが loop1.el 手でちょっとだけ最適化してみたのが loop2.el Translate to Elisp from LLVM-IR code

LLVM-IRをSchemeに翻訳

愚直にSchemeに翻訳してGaucheで動かしてみたのがこちら。 lliの100倍の時間がかかる。しかしGaucheは速い。 Translate to Scheme from LLVM-IR code

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

cmigemoを1000倍非力なCPUで動かすとどれくらい使えないかを測ってみた。 cmigemoの検索クエリから正規表現への展開は1000回実行しても100ms程度で、実用的な範囲。 しかし、mcigemoが辞書をロードする時間は1000回実行すると3分もかかる。これは実用にならない。

っと、ここで夢から覚めて我に返った(←イマココ) いやー妄想って楽しいもんです。