Tiny Vector Matrix library using Expression Templates の略。文字どおり小さなサイズの行列とベクトルの数値計算のためのライブラリ。例を実行してみたらインチキみたいに速かったので、どんなインチキを使っているのかとソースを眺めてみた。Introduction によると Expression Templates の他に、Template Metaprograms を使って、ループの展開を行なっているそうだ。Template Metaprograms とは、例えば次のようにコンパイル時に階乗を計算してしまったりすること(正確には、これは compile-time template programming であって、template meta-programming じゃないようですが)。
#include <iostream> template<int N> class Factorial { public: enum { value = N * Factorial<N-1>::value }; }; class Factorial<1> { public: enum { value = 1 }; }; int main(){ int i = Factorial<4>::value; std::cout << i << " must be 4!." << endl; }
tvmet ではそう難しい Template Metaprogramming はしていなくて、基本的にはこれと同じ程度のテンプレートの再帰をやっているだけのようだ。具体的には include/tvmet/meta の各 *.h ファイルの中。行列やベクトルのサイズがあらかじめ決められた大きさを越えると、metaprogramming は使わずに、include/tvmet/loop で定義された普通の loop を回すコードが使われる。loop を回すといっても、Duff's device を使っていたりするわけですが。
最近のコメント