我一直在尝试搜索谷歌,但无法找到任何有用的东西。
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);
答案 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向量,就像普通调用约定所指定的那样。可能它将它们视为与按值传递的大小的结构相同。
请参阅x86标记维基中的ABI链接或维基百科上的x86 Calling Conventions页面(大部分内容都没有提及向量寄存器)。
由于GNU C Vector Extensions语法不依赖于任何特定硬件,因此使用32字节向量仍将编译为正确的代码。它会表现不佳,但即使编译器只能使用SSE指令,它仍然可以工作。 (最后我看到,gcc在生成代码以处理比目标机器支持更广泛的向量方面做得非常糟糕。使用-march
使用16B向量的机器可以获得明显更好的代码手动。)
无论如何,重点是你得到警告而不是编译器错误,因为 vector_size(16)
并不意味着AVX具体,但是AVX或其他256b向量指令集是它需要编译成好的代码。