常用のノートPCをレッツノートのSX1からSX3にしました。
ついでにvmwareを最新にし、vmwareの中で飼ってるubuntuを14.04に。
CPUがSandyBridgeからHaswellになったので、ちょっとFMAで遊んでみました。
Haswellの新機能の一つに、FMA命令の追加があります。
FMA = Fused Multiply Add です。乗算と加算のフュージョンですね。
a * b + cをいっぺんに計算してくれる機能で、内積計算なんかが高速になりそうですが、
精度保証的には「a*bをいったん無誤差で計算してからcを加算し、最後に一回だけ丸める」という
動作が重要です。これを使うとtwoproductが非常に簡単に書けたりします。
で、ちょっと動くかどうか試してみました。
#include <stdio.h>
#include <immintrin.h>
double fma(double a, double b, double c)
{
double d;
__m128d va = _mm_set_sd(a);
__m128d vb = _mm_set_sd(b);
__m128d vc = _mm_set_sd(c);
__m128d vd = _mm_fmadd_sd(va, vb, vc);
_mm_store_sd(&d, vd);
return d;
}
int main()
{
printf("%f\n", fma(1., 2., 3.));
}
こんな感じで動きました。gccだと-mfmaとか-march=nativeとか必要。VCは特に要らない?
AVXなので4並列で実行する能力がありますが、このコードは1つだけ計算してます。
1つだけ計算するのに128bitレジスタを使わなきゃいけないのはちょっと違和感?
twoproductに用いたときの性能評価とかはこれからぼちぼちやっていきましょう。