【问题标题】:Compiling legacy GCC code with AVX vector warnings编译带有 AVX 矢量警告的遗留 GCC 代码
【发布时间】:2019-10-01 17:20:20
【问题描述】:

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

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

【问题讨论】:

  • 没有我的投票,但看起来你倾倒了一段代码,只有一行文字“在谷歌上找不到”。一般来说,这些都不是好问题。您可能想解释一下您正在尝试做什么 - 当您不了解 AVX 是什么时,您为什么要尝试使用它?
  • 您应该在文本段落中提出问​​题,而不是在代码块中作为 cmets。

标签: c++ gcc avx


【解决方案1】:

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

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

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

请参阅 标签 wiki 中的 ABI 链接,或 Wikipedia 上的 x86 Calling Conventions 页面(大多未提及向量寄存器)。


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

无论如何,关键是您会收到警告而不是编译器错误,因为 __attribute__ ((vector_size(32))) 并不特别暗示 AVX,但需要 AVX 或其他一些 256b 向量指令集才能编译成好的代码。

【讨论】:

  • 谢谢!我面临一个不同的问题,但您的回复给了我足够的提示,关于这个几乎没有记录的属性的行为,我可以猜测如何解决我的问题。
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多