我试着用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)
我的两个困惑:
发布于 2021-04-29 06:20:05
GCC提供的向量扩张旨在提供一种方法,以机器独立的方式访问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_int和eight_short是对应的元素数和类型的向量。它们都是16个字节,因此适合存储在128位SIMD寄存器中.将一个分配给另一个显然意味着“重新解释”(又名位转换),但它也违反了类型安全性。据推测,以前的编译器版本曾经接受过这样的代码,而且可能有类似的代码,但是编译器的作者想要阻止它。所以默认情况下是这样的代码现在会导致错误。,但是它们提供了一个选项-flax-vector-conversions,您可以在编译像若要抑制错误,请执行这样的旧代码时使用这个选项。
“新代码”是指您第一次编写的代码,您可以选择如何编写它。对于这样的代码,您很可能使用v2 = reinterpret_cast<four_int>(v1);,而不是使用-flax-vector-conversions。然后编译器将标记任何您忘记转换的地方(因为它可能是一个bug,而实际上您的意思是其他的)。
如果您正在编译遗留代码,最好的选择是先尝试在没有此选项的情况下构建。如果它构建成功,则不需要该选项,所以不要使用它。如果在向量类型转换方面出现错误,可以考虑使用此选项,或者在需要时使用显式转换重写代码。
https://stackoverflow.com/questions/67311569
复制相似问题