2011年7月26日火曜日

Matlab を mex で高速化

SNL の計算の場合、行列の大きさ、特に行数が 2 or 3 と固定されているので、これを利用すると Matlab で行っている計算の一部を mex つまり C or C++ or Fortran で高速化できる。

Matlab の行列演算は基本的に lapack, blas なので、行列演算自体を mex で呼んでも高速化できないが 行数が固定されているので、これを利用して高速化できるのである。

たとえば、行列 X の各列ベクトルのノルムを求めるには、
y = norm(sum(X.*X))
となるが、
X の行数が3と固定である場合には、C++ で
for (j=0;j<n;++j)  y[j] = sqrt(X[3*j]*X[3*j]+X[3*j+1]*X[3*j+1]+X[3*j+2]*X[3*j+2]);
のよう直に記述すると高速にできる。
(3をループにしないのが効いている。)

これらの方法を使って SNL の計算の 50 % 程度を短縮できている。
あともう少し短縮できるはずなので、それをどうするかが検討するところである。

今日の作業内容:mex 高速化 5h
今日のランチ:ちゅらさん 島豚しょうが焼き
明日の予測作業時間:5h

0 件のコメント:

コメントを投稿