Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

数学関数のインライン展開 - SPVM開発日記

わかりやすく、SPVM開発日記というのを、おしりにつけることにした。

今日は、次に実装する予定の数学関数のインライン展開の実装予定について書く。

SPVMでは、C99の数学関数複素数の関数を含めて、すべてサポートする予定だ。ひとつの重要な課題はパフォーマンス。

関数呼び出しはパフォーマンスの負担が大きい

C言語をラッピングしている言語にとっては、C言語の関数呼び出しのパフォーマンス負担はかなり大きいものとなる。たとえば、sin関数を繰り返し呼び出したい場合に、これ自体がパフォーマンス負荷になる。

関数呼び出しは、特に、C言語をラッピングしている言語であれば、パフォーマンス負担が大きい。新しい関数のスタックを確保したり、関数の情報を取得したり、外部関数呼び出しの名前を解決したりと、仮引数をコピーしたりと、関数の先頭では、やらないといけない処理が非常に多い。

また、関数呼び出しにおける、例外のチェックが繰り返し入る。

これをsin関数を呼び出すごとにやっていたのでは、集合演算では、大きなコストになるだろうと予測している。

そうだ、Perlの標準関数を参考にしよう

Perlのサブルーチン呼び出しは遅いが、標準関数呼び出しは速い。その理由は、関数というよりも、ループの中でインライン化されているからだ。

それで、数学関数の呼び出しについては、標準でサポートするものについては、インライン展開したらどうだろうという考えに至った。

インライン展開するためには、仕様とソースコードが必要

インライン展開するために、必要なものは、関数の仕様を確定することと、ソースコードを実行環境でも利用できるようにすることだ。

  1. 開発環境におけるソースコードを、実行環境でも利用できるようにする。
  2. 標準関数のCのソースコードをプリコンパイルするコードに差し込んで、gccにインライン展開してもらう。
  3. 仕様化することで、SPVMのバージョンが異なる、どの環境においても、呼び出し規則と、実行結果が一致するようにする。