首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ARM编译器来说,“亚麻矢量转换”到底意味着什么?

对ARM编译器来说,“亚麻矢量转换”到底意味着什么?
EN

Stack Overflow用户
提问于 2021-04-29 05:38:43
回答 1查看 546关注 0票数 1

我试着用arm-linux-gnueabihf gcc/g++编译器编写一个xxx.toolchain.cmake。

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

代码语言:javascript
复制
-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. “新代码”是什么意思?为什么“新代码”不应该与此编译选项一起使用?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 06:20:05

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

考虑以下代码:

代码语言:javascript
复制
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寄存器中.将一个分配给另一个显然意味着“重新解释”(又名位转换),但它也违反了类型安全性。据推测,以前的编译器版本曾经接受过这样的代码,而且可能有类似的代码,但是编译器的作者想要阻止它。所以默认情况下是这样的代码现在会导致错误。,但是它们提供了一个选项-flax-vector-conversions,您可以在编译像若要抑制错误,请执行这样的旧代码时使用这个选项。

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

如果您正在编译遗留代码,最好的选择是先尝试在没有此选项的情况下构建。如果它构建成功,则不需要该选项,所以不要使用它。如果在向量类型转换方面出现错误,可以考虑使用此选项,或者在需要时使用显式转换重写代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67311569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档