本項では、残された課題点についてまとめます。
-
CPU のベクトル演算専用命令を利用可能にする
今回の実装では、
インラインアセンブラによる CPU のベクトル演算専用命令を使用していません。
インラインアセンブラを用いると、
コンパイラが計算過程を最適化できなくなり、
演算過程の中間値などが実体出力されてしまうためです。
インラインアセンブラによるベクトル演算専用命令を効率よく生成させるには、
さらなる工夫が必要です。
-
inline 展開の程度をコントロール可能にする
例えば行列同士の積などは、inline 展開されるコード量が大きく、
コンパイルにも時間がかかってしまいます。
用途によっては、inline 展開を避けたほうが良いかも知れません。
-
次元の一致しない計算などへの禁則処理を導入する
コンパイル段階で
不正な計算式に対して警告を出すような仕組みが欲しいところです。
このような禁則処理には、
コンパイラの型チェック機能が使えますが、
コンパイラ内部エラーを回避できず、実装を見合わせています。
-
swizzle 指定部の末尾に必ず必要な () を除去する
swizzle 指定機能を、メソッドとして実装しているため、
必ず括弧を書かなければならず面倒です。
swizzle 指定機能を、メソッドではなく union メンバで実装すれば、
この問題は解消しますが、C++ の言語仕様上無理なようです。
-
ベクトル及び行列の成分の型を template 引数として指定可能にする
現状では、成分の型は float で固定となっていますが、
成分の型は template 引数として指定できた方が便利です。
しかし、これについてもコンパイラ内部エラーを回避できず、実装を見合わせています。
-
最適化効率のさらなる向上を図る
tvmet のようなテンプレート・メタプログラミングの手法を用いれば、
ベクトル要素の演算順序を適切にコントロールして、
幾分効率の良いコードを生成することが可能です。
ただ、VC 上ではコンパイラ内部エラーを回避できず、実装を見合わせています。
-
4 次元以上をサポート
ベクトルは 4 次元、行列は 4x4 が上限です。
さらに高い次元も扱えるようにしたいところです。
-
最適化効率がコンパイラに依存しないような工夫を行う
今回の実装では、VC++6.0 向けに調整しましたが、
その他のコンパイル環境では、最適化効率が落ちる恐れがあります。
-
コンパイル速度の向上を図る
単純な計算式であっても、コンパイル時に一度冗長なコードに展開されるため、
コンパイルに時間がかかります。
inline 展開結果のコードを軽量化する必要があります。
|