C++ 使用AVX矢量警告编译遗留GCC代码

C++ 使用AVX矢量警告编译遗留GCC代码,c++,gcc,avx,x86,C++,Gcc,Avx,X86,我一直试图在谷歌上搜索,但找不到任何有用的东西 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"? //

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

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);

这不是遗留代码<代码>属性(矢量大小(32))表示32字节的矢量,即256位,它(在x86上)表示AVX。()

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

因此,编译器不能像常规调用约定那样在寄存器中传递或返回256b向量。可能它将它们视为通过值传递的大小相同的结构

请参阅标记wiki中的ABI链接,或Wikipedia上的页面(大部分没有提到向量寄存器)


由于GNUCVectorExtensions语法不与任何特定硬件绑定,因此使用32字节的向量仍然可以编译正确的代码。它的性能会很差,但即使编译器只能使用SSE指令,它仍然可以工作。(上一次我看到的是,众所周知gcc在生成代码以处理比目标机器支持范围更宽的向量方面做得非常糟糕。手动使用
vector\u size(16)
可以为具有16B向量的机器获得更好的代码。)


无论如何,关键是你会得到一个警告而不是编译器错误,因为
\uuuuu属性((vector\u size(32))
并不意味着AVX特别是,但AVX或其他256b向量指令集是编译成好代码所必需的。

不,我的投票,但看起来你扔掉了一段代码,只有一行文字“在谷歌上找不到”。一般来说,这些都不是好问题。你可能想解释一下你想做什么-当你不明白AVX是什么的时候为什么要尝试使用它?你应该在文本段落中提问,而不是在代码块中作为注释。谢谢!我面临着一个不同的问题,但是您的回答已经给了我足够多的关于这个几乎没有文档记录的属性行为的提示,我能够猜测如何解决我的问题。