木本システムブログ

木本システムの代表「木本裕紀」がPerlについて熱く語るブログ。Perlプログラミングちゃんねるで、ユーチューバー,をしています。

数値計算のためのSPVMの基礎機能の実装 - 実数、複素数、クォータニオンの高速な四則演算と集合演算

SPVMの数値計算のための基礎機能の実装。SPVMの1.0のリリースに向けて、試験をしていますが、基本機能として足りないものが、わかってきたので、それを実装する。

プログラミング言語の基礎機能として、実数、複素数、クォータニオンの高速な四則演算と集合演算ができる必要がある。

実数は、1次元世界、複素数は、2次元世界、クォータニオンは3次元世界に対応

実数は、1次元世界、複素数は、2次元世界、クォータニオンは3次元世界に対応(4次元だが3次元世界のために使う)。

この世界の中で、拡大・縮小と回転をするためには、実数、複素数、クォータニオンの高速な四則演算と集合演算を実装する必要がある。

まず、足し算、引き算、掛け算。そして、定数倍。定数倍は、拡大・縮小を表現。掛け算は、回転を表現。

割り算は、定義できない場合があるが、共役をとれば、割り算は、共役と掛け算に分解することが可能。

集合演算としての、配列と行列

集合演算として、配列と行列の四則演算を定義する。要素として、実数、複素数、クォータニオンを持つことができる。これに加えて、N次元配列も実装したいが、実装が複雑すぎるので、外部ライブラリとして実装する選択にする。また、3次元以上のN次元配列が本当に必要になる場面は、科学技術計算の分野を除いて、限定されるだろうと感じもある。

行列の場合は、割り算を定義できないが。逆行列を求めることで、割り算を、掛け算と逆行列に分解することができる。ベクトルを特定の方向に対してに分解するために、行列式も求められた方がよいだろう。

CUDAで行列を演算するためにはcubrasを使うことが分かったが、bras系のライブラリは、列優先の行列を必要とする。このために、SPVMの行列データ構造は、列優先とする。

DirectXは、行優先の行列を必要とするが、転置行列を求める機能を用意して、転置行列変換と行と列を入れ替えるだけで、DirectXのような行優先のライブラリの入力を作れるようにする。

そして何より、集合演算だけでなく、要素の演算もC言語に近いパフォーマンスを出せることが必要だ。

このようなわけで、この機能を実装して、試験をして、ドキュメントを書くためには、少なくとも3ヵ月はかかりそうだ。