gccのインラインアセンブラでレジスタに別名をつける
register __m128* tmp asm ("xmm0"); asm volatile ( "pxor %[tmp], %[tmp]" : [tmp] "+x" (tmp) );
なんだかまわりくどいですね…。
このコードは、
pxor %xmm0, %xmm0
に展開されます。
MOVDQUの特性について
IntelのOptimization Manualの2.2.5.1 Efficient Handling of Alignment Hazardsによると、Nehalem系CPUからMOVDQUの性能が向上したとあるので、実験してみました。
4パターンのmovを実行して速度差を見ます。alignedはアクセス先のアドレスが16バイトアライメントが取られているの意味、splitはアクセス先の領域(先頭+16バイト)がcache lineを跨ないの意味です。
- aligned MOVDQA
- aligned MOVDQU
- not-aligned split MOVDQU
- not-aligned not-split MOVDQU
実行環境はCore i5 2.66GHzと、Core2 Duo 1.6GHzです。続きにあるアセンブラ片を300000000回実行しています。
Core i5 | Core2 Duo | |
---|---|---|
aligned MOVDQA | 0.653 sec | 1.13 sec |
aligned MOVDQU | 0.633 sec | 2.26 sec |
not-aligned split MOVDQU | 2.802 sec | 14.947 sec |
not-aligned not-split MOVDQU | 0.636 sec | 2.26 sec |
確かにNehalem系CPUは、以前のCPUと比べてMOVDQUの性能が改善されています。cache lineを跨がなければMOVDQAと同じ速度が出ています。
続きを読む