使用AVX矢量警告编译传统GCC代码

时间:2016-09-08 05:29:36

标签: c++ gcc avx

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

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

1 个答案:

答案 0 :(得分:3)

那不是遗留代码。 { "notification ": { "title": "some title", "text": "some text" }, "to": "XjV2kOqh1yXNkJsQop17RlwSwT4jZpuAu-...", "priority": "high" } 表示32字节向量,即256位,(在x86上)表示AVX。

除非您使用__attribute__ ((vector_size(32)))(或包含该-mavx的{​​{1}}设置),否则AVX无法启用。如果没有这个,编译器就不允许生成使用AVX指令的代码,因为那些会在不支持AVX的旧CPU上触发非法指令错误。

因此编译器无法在寄存器中传递或返回256b向量,就像普通调用约定所指定的那样。可能它将它们视为与按值传递的大小的结构相同。

请参阅标记维基中的ABI链接或维基百科上的x86 Calling Conventions页面(大部分内容都没有提及向量寄存器)。

由于GNU C Vector Extensions语法不依赖于任何特定硬件,因此使用32字节向量仍将编译为正确的代码。它会表现不佳,但即使编译器只能使用SSE指令,它仍然可以工作。 (最后我看到,gcc在生成代码以处理比目标机器支持更广泛的向量方面做得非常糟糕。使用-march使用16B向量的机器可以获得明显更好的代码手动。)

无论如何,重点是你得到警告而不是编译器错误,因为 vector_size(16)并不意味着AVX具体,但是AVX或其他256b向量指令集是它需要编译成好的代码。