c - 使用 _mm256_load_ps() Intel 内在函数时出错

标签 c intel simd

我尝试使用 _mm256_load_ps() 内在函数来使我的程序运行得更快。这意味着我想一次加载 8 个 float 并将它们存储在 266b vector 中以用于进一步计算。

/* 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 vector 返回会更改 ABI [-Wpsabi]

PS:我使用的是 Ubuntu 12.04 LTS 64 位

最佳答案

您的 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
<小时/>

请注意,在正常的 Makefile 设置中,-c 不应成为 CFLAGS 的一部分。它应该是 .c.o 模式规则的一部分。

此外,使用更现代的编译器将获得更好的结果。 Ubuntu 12.04 已经有 5 年多的历史了,在 AVX 还很新的时候就已经出现了。较新的编译器在最近的 CPU 扩展方面做得更好。 gcc6.3是一个不错的选择。 gcc7.1 已经发布,但它仍然很新。

关于c - 使用 _mm256_load_ps() Intel 内在函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811620/

相关文章:

preprocessor - 区分 ifort 和其他 fortran 编译器的宏是什么?

c - 英特尔 SSE 内在函数 _mm_load_si128 段错误,

c# - Mono 中的 SIMD 是否还有任何发展?

c - 声明一个具有全局大小的数组

C:在 if 条件下调用 close()

windows - 写入 CPU 寄存器实际上是如何工作的?

c++ - 内联汇编的麻烦

c - 使用 SSE 模拟标准 Math.pow 函数

c - 提示用户重新输入号码

C 自动扩展指针数组