今日学んだこと
なんか実験で並列プログラミングとかいうのをやっていて、並列化する前に逐次実行のコードを速くしようとしてるんですけど、そういうことほとんどしたことないし、よくわからないですね。
とりあえず、ループの順番入れ替えるとかなんとかしてキャッシュミス減らして、むふーっていってます。
Cは投げ捨ててnasmとかで書くとよいのではないかなぁ、と思っとるんですがやる気次第。
double s = 0; for(i=0; i<k; ++i) s += a[i]; b[j] -= s;
と
double s = b[j]; for(i=0; i<k; ++i) s -= a[i]; b[j] = s;
だと、上のほうが速い。(ほんのちょっと)
なぜかはしりません。きっとそうではない環境とかもあるでしょう。
double s = 0; double *p = a; for(i=0; i<k; ++i) s += *p++; b[j] -= s;
のほうがもうちょっと速い。
あとループアンローリング???とかいうのすごいですね.....
明日、SIMDとか試す