编译器真的好聪明好聪明耶
看来我不用自己学写汇编来优化SIMD操作了?
简单的向量相加:
使用了GCC 4.7:
gcc -c -O3 -o vec.o vec.c --std=c99 -mavx2
它居然识别出了我的意图:
好开心啊~~
不过,后面相加四个double的时候,看起来每个向量都使用了2个指令把数据读到SIMD的寄存器,不能一次读256位吗?
简单的向量相加:
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位吗?
...全文
相关推荐
javab:稍微修改了 Java 编译器。 跟踪形状使用。 真的不多
Java稍微修改了 Java 7 编译器。 跟踪形状使用。 真的不多。建造设置你的JAVA_HOME变量,然后运行: cd langtools/make; sh blg-build.sh cd lan
更聪明的旺财-易语言
用户可以通过双击运行这个文件来启动"更聪明的旺财"。易语言的编译器会将源代码转化为可执行文件,这个过程包括了代码优化、资源打包等多个步骤,确保程序能够在不同的系统环境下稳定运行。
MSVC编译器
然而,值得注意的是,即使不安装完整的Visual Studio,也可以单独使用MSVC编译器进行开发工作。
java编译器
总的来说,Java编译器是Java开发的基础,它确保了代码的正确性和跨平台性。了解并熟练掌握Java编译器的使用和工作原理,对于Java开发者来说至关重要。
python编译器
下载说明.txt"可能是指导用户如何获取和安装Python编译器或其他相关工具的文本文件。"第七下载.url"看起来是一个链接,可能指向Python编译器或其他相关软件的下载地址。"


