我尝试使用_mm256_load_ps()内在函数来让我的程序运行得更快。这意味着我想一次加载8个浮点数并将它们存储在266b向量中以使用它们进行进一步的计算。
/* code snipet */
a_vec = _mm256_load_ps(&a[0])
b_vec = _mm256_load_ps(&b[0])
res = _mm256_addsub_ps(a,b)
/* code snipet */
另外,我在makefile中使用了这些标志:
CC=gcc
CFLAGS=-g -c -Wall -O5 -mavx -mfma -ffast-math
我确保我的处理器支持AVX扩展。但是当我编译代码时,我一直收到这个警告:
警告:未启用AVX的AVX矢量返回会更改ABI [-Wpsabi]
PS:我正在使用Ubuntu 12.04 LTS 64bits
答案 0 :(得分:2)
您的Makefile或构建中的其他内容已损坏。 -O5 -mavx
肯定会启用AVX,因此警告告诉我们您的编译器没有看到这些选项。
据推测,您的代码根本不会编译,稍后会出现错误消息。如果未启用AVX支持,则无法识别_mm256_load_ps
。
此代码:
#include <immintrin.h>
__m256 foo(const float *a, const float *b)
{
__m256 a_vec = _mm256_load_ps(&a[0]); // assumes a and b are 32-byte aligned.
__m256 b_vec = _mm256_load_ps(&b[0]);
__m256 res = _mm256_addsub_ps(a_vec, b_vec);
return res;
}
使用gcc -march=haswell -O3
(-march=haswell
隐含-mavx
)编译就可以了。 The asm output is:
vmovaps ymm0, YMMWORD PTR [rdi]
vaddsubps ymm0, ymm0, YMMWORD PTR [rsi]
ret
请注意,-c
不应该是普通Makefile设置中CFLAGS
的一部分。它应该是.c
到.o
模式规则的一部分。
此外,使用更现代的编译器可以获得更好的效果。 Ubuntu 12.04已经超过5年了,AVX还是很新的时候出来了。较新的编译器在最近的CPU扩展中做得更好。 gcc6.3是个不错的选择。 gcc7.1已经发布了,但它仍然很新。