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

jiandingzhe 2012-08-15 10:42:43
看来我不用自己学写汇编来优化SIMD操作了?
简单的向量相加:

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

它居然识别出了我的意图:

vec.o: file format elf64-x86-64


Disassembly 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位吗?
...全文
910 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitcser01 2012-08-15
  • 打赏
  • 举报
回复
楼主是来散分的吗?JF,谢啦!
赵4老师 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
编译器有聪明的时候,也有自作聪明的时候。
[/Quote]
然也!
xunxun 2012-08-15
  • 打赏
  • 举报
回复
自动向量化不就是干这个的,有啥大惊小怪
fzamygsd 2012-08-15
  • 打赏
  • 举报
回复

编译器很体贴
Corner 2012-08-15
  • 打赏
  • 举报
回复
编译器有聪明的时候,也有自作聪明的时候。
huangdancs 2012-08-15
  • 打赏
  • 举报
回复
哈哈,编译器肯定是很聪明的。
  • 打赏
  • 举报
回复
好牛的编译器!
冰与火 2012-08-15
  • 打赏
  • 举报
回复
楼主:vs2010有相应功能吗?
didijiji 2012-08-15
  • 打赏
  • 举报
回复
编译器也是人写的嘛。
titer1 2012-08-15
  • 打赏
  • 举报
回复
gcc designer 的功劳

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧