gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:19:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com