读书人

编译器真的美聪明好聪明耶

发布时间: 2012-09-07 10:38:15 作者: rapoo

编译器真的好聪明好聪明耶
看来我不用自己学写汇编来优化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有相应功能吗?
[解决办法]
好牛的编译器!

读书人网 >C语言

热点推荐