gpt4 book ai didi

c++ - 使用 AVX vector 警告编译旧版 GCC 代码

转载 作者:行者123 更新时间:2023-12-01 20:26:56 24 4
gpt4 key购买 nike

我一直在尝试在谷歌上搜索,但找不到任何有用的东西。

typedef int64_t v4si __attribute__ ((vector_size(32)));

//warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
// so isn't AVX already automatically enabled?
// What does it mean "without AVX enabled"?
// What does it mean "changes the ABI"?
inline v4si v4si_gt0(v4si x_);

//warning: The ABI for passing parameters with 32-byte alignment has changed in GCC 4.6
//So why there's warning and what does it mean?
// Why only this parameter got warning?
// And all other v4si parameter/arguments got no warning?
void set_quota(v4si quota);

最佳答案

这不是遗留代码。 __attribute__ ((vector_size(32)))表示 32 字节 vector ,即 256 位,(在 x86 上)表示 AVX。 (GNU C Vector Extensions)

除非您使用 -mavx,否则不会启用 AVX (或包含它的 -march 设置)。否则,编译器将无法生成使用 AVX 指令的代码,因为这些指令会在不支持 AVX 的旧 CPU 上触发非法指令错误。

因此编译器无法像正常调用约定指定的那样在寄存器中传递或返回 256b vector 。可能它会将它们视为按值传递的该大小的结构。

请参阅 中的 ABI 链接标签 wiki,或 x86 Calling Conventions维基百科页面(大部分没有提到 vector 寄存器)。

<小时/>

由于 GNU C vector 扩展语法不依赖于任何特定硬件,因此使用 32 字节 vector 仍将编译为正确的代码。它的性能会很差,但即使编译器只能使用 SSE 指令,它仍然可以工作。 (最后我看到,众所周知,gcc 在生成处理比目标机器支持的 vector 更宽的代码方面做得非常糟糕。对于具有 16B vector 的机器,通过手动使用 vector_size(16) 可以获得明显更好的代码。)

无论如何,重点是您会收到警告而不是编译器错误,因为 __attribute__ ((vector_size(32)))并不专门暗示 AVX,但需要 AVX 或其他一些 256b vector 指令集才能编译为良好代码。

关于c++ - 使用 AVX vector 警告编译旧版 GCC 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39383193/

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