使用_mm256_load_ps()Intel内在时出错

时间:2017-06-28 20:04:29

标签: c intel simd

我尝试使用_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

1 个答案:

答案 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已经发布了,但它仍然很新。