ゆっくりプログラム高速化
http://d.hatena.ne.jp/w_o/20130206#1360077118
を書いたときに、よく考えたら、重箱すみつつきばっかやってて、普通にプログラムの書きかたの説明とか書いたことないな、とふと思って、
https://twitter.com/tanakmura/status/298898528145666048
とか書いたら、まあ、いくらかゲタはかせれば65535と言ってもいいくらいのRTしてもらったので、なんか書こうと思ったがせっかくだから動画にしようと思って、
http://www.nicovideo.jp/watch/sm20127515
こういうのを作った。
まあ作った感想としては、作業量の割に内容薄すぎるから、これだけ作業するやる気があったら、普通に文章書いたほうが明らかに良さげだし、そもそもそれだけ気力あるならコード書けよという感じだった。
でも、作業Aのやる気は作業Bのやる気と等価変換できるわけではないので、そういうわけでもないというか、まあコード書くよりくだらない文章書いてるほうがやる気あるとかアレなのでもうプログラマはやめようと思った。
とりあえず何かに開眼するかもしれないのであと二回くらいは頑張ろうと思う。そっから先はやる気次第。
作業開始してから二週間かかってるので多分隔週ぐらいになると思う。
最適化オプション付けないでmath.hをインクルードしないときのsinの挙動
遅いのが謎だが…
レジスタの初期値が辛い値になってるかと思ったけど、
__declspec(noinline) int a(int v) { return cos(v); } int main() { int i; __int64 b,e; a(100); b = __rdtsc(); for (i=0; i<100; i++) { if (1) { __asm { pxor xmm0, xmm0; pxor xmm1, xmm1; pxor xmm2, xmm2; pxor xmm3, xmm3; pxor xmm4, xmm4; pxor xmm5, xmm5; pxor xmm6, xmm6; pxor xmm7, xmm7; } } a(0); } e = __rdtsc(); printf("%lld\n", e-b); }
こういうのでもmath.h入れないほうが遅い。
math.hなし(35000clkぐらい)
_a PROC ; File c:\users\w0\test\cl\sin.c ; Line 5 push ebp mov ebp, esp ; Line 6 mov eax, DWORD PTR _v$[ebp] push eax call _cos add esp, 4 ; Line 7 pop ebp ret 0
あり。(3500clkぐらい)
_a PROC ; File c:\users\w0\test\cl\sin.c ; Line 5 push ebp mov ebp, esp sub esp, 8 ; Line 6 cvtsi2sd xmm0, DWORD PTR _v$[ebp] sub esp, 8 movsd QWORD PTR [esp], xmm0 call _cos add esp, 8 fstp QWORD PTR tv72[ebp] movsd xmm0, QWORD PTR tv72[ebp] cvttsd2si eax, xmm0 ; Line 7 mov esp, ebp pop ebp ret 0
いや引数スタックだからxmmレジスタ関係ないだろ。しかし寒くて手が動かんのでまあいいや…多分スタックに変な値のってるとかそれ系だろ…
追記0222
戻り値がFPスタックに積まれて返ってくるが、ポップしてないからFPスタック溢れて何かが起こってる系だった。
FPスタックって溢れたらどうなるんだっけ…まあ気が向いたら調べる。