编译器真的好聪明好聪明耶
看来我不用自己学写汇编来优化SIMD操作了?
简单的向量相加:
- C/C++ code
typedef struct { float x; float y; float z; float w;} vec4f;typedef struct { double x; double y; double z; double w;} vec4d;void vec4f_add(vec4f* restrict a, vec4f* restrict b) { a->x += b->x; a->y += b->y; a->z += b->z; a->w += b->w;}void vec4d_add(vec4d* restrict a, vec4d* restrict b) { a->x += b->x; a->y += b->y; a->z += b->z; a->w += b->w;}使用了GCC 4.7:
gcc -c -O3 -o vec.o vec.c --std=c99 -mavx2
它居然识别出了我的意图:
- Assembly code
vec.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 <vec4f_add>: 0: c5 f8 10 0f vmovups (%rdi),%xmm1 4: c5 f8 10 06 vmovups (%rsi),%xmm0 8: c5 f0 58 c0 vaddps %xmm0,%xmm1,%xmm0 c: c5 f8 11 07 vmovups %xmm0,(%rdi) 10: c3 retq 11: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1) 18: 0f 1f 84 00 00 00 00 1f: 00 0000000000000020 <vec4d_add>: 20: c5 f9 10 0f vmovupd (%rdi),%xmm1 24: c5 f9 10 06 vmovupd (%rsi),%xmm0 28: c4 e3 75 18 4f 10 01 vinsertf128 $0x1,0x10(%rdi),%ymm1,%ymm1 2f: c4 e3 7d 18 46 10 01 vinsertf128 $0x1,0x10(%rsi),%ymm0,%ymm0 36: c5 f5 58 c0 vaddpd %ymm0,%ymm1,%ymm0 3a: c5 f9 11 07 vmovupd %xmm0,(%rdi) 3e: c4 e3 7d 19 47 10 01 vextractf128 $0x1,%ymm0,0x10(%rdi) 45: c5 f8 77 vzeroupper 48: c3 retq
好开心啊~~
不过,后面相加四个double的时候,看起来每个向量都使用了2个指令把数据读到SIMD的寄存器,不能一次读256位吗?
[解决办法]
哈哈,编译器肯定是很聪明的。
[解决办法]
编译器有聪明的时候,也有自作聪明的时候。
[解决办法]
编译器很体贴
[解决办法]
自动向量化不就是干这个的,有啥大惊小怪
[解决办法]
[解决办法]
楼主是来散分的吗?JF,谢啦!
[解决办法]
gcc designer 的功劳
[解决办法]
编译器也是人写的嘛。
[解决办法]
楼主:vs2010有相应功能吗?
[解决办法]
好牛的编译器!