【问题标题】:What does "-flax-vector-conversions" exactly mean for ARM compiler?“-flax-vector-conversions”对于 ARM 编译器到底意味着什么?
【发布时间】:2021-07-22 11:30:10
【问题描述】:

我正在尝试从 arm-linux-gnueabihf gcc/g++ 编译器编写一个 xxx.toolchain.cmake。

让我困惑的是,我是否应该使用-flax-vector-conversions 编译标志。我阅读了编译器的文档/手册页,它告诉:

-flax-vector-conversions

Allow implicit conversions between vectors with differing numbers of elements and/or incompatible element types. This option should not be used for new code.

(通过https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html

我的两个困惑:

  1. 这个解释中的“向量”是什么意思?有没有例子说明这一点?

  2. “新代码”是什么意思?为什么“新代码”不应该与这个编译选项一起使用?

【问题讨论】:

  • 顺便说一句,“f”前缀很容易被误读为“亚麻矢量转换”。

标签: c++ arm compiler-flags


【解决方案1】:

GCC 提供vector extensions,旨在提供一种以与机器无关的方式(与内在函数相反)访问 SIMD 指令的方法。这涉及使用__attribute__((vector_size(n))) 定义的特殊向量类型,以帮助编译器理解 SIMD 指令使用的打包多元素数据类型。请注意,这与 C++ 的 std::vector 容器无关。

考虑以下代码:

typedef short eight_short __attribute__((vector_size(16)));
typedef int four_int __attribute__((vector_size(16)));

eight_short v1;
four_int v2;

void foo(void) {
    v2 = v1;
}

这里的four_inteight_short 是相应数量的元素和类型的向量。它们都是 16 字节,因此适合存储在 128 位 SIMD 寄存器中。将一个分配给另一个显然意味着“重新解释”(又名位转换),但它也违反了类型安全。据推测,旧版本的编译器曾经接受这样的代码,并且可能有这样的代码,但编译器作者希望阻止它。所以默认情况下是such code now causes an error,但它们提供了-flax-vector-conversions 选项,您可以在编译类似to suppress the error 这样的旧代码时使用该选项。

“新代码”是指您第一次编写的代码,您可以选择如何编写它。对于此类代码,您最有可能使用v2 = reinterpret_cast<four_int>(v1);,而不是-flax-vector-conversions。然后编译器将标记您忘记转换的任何地方(因为它可能是一个错误,您实际上意味着其他东西)。

如果您要编译旧代码,最好先尝试不使用此选项进行构建。如果它构建成功,则不需要该选项,因此不要使用它。如果在向量类型转换时出现错误,您可以考虑使用此选项,或者在需要时使用显式转换重写代码。

【讨论】:

  • 很好的解释!然后我会为我的 xxx.toolchain.cmake 删除-flax-vector-conversions 选项。谢谢
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 2014-03-17
  • 2020-10-12
  • 2016-08-05
  • 1970-01-01
  • 2010-10-22
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多