【问题标题】:Compilation error using AltiVec SIMD vector type in C++在 C++ 中使用 AltiVec SIMD 向量类型的编译错误
【发布时间】:2023-03-19 23:21:01
【问题描述】:

以下是代码:

int add = foo;
vector signed int v_add;
v_add[0] = add;

错误是:error: invalid types 'vector int[int]' for array subscript

当我尝试add = v_add[0];时问题仍然存在

请解释这个问题的原因。我正在使用 gnu 版本 3.3.2

【问题讨论】:

    标签: c++ gcc simd powerpc altivec


    【解决方案1】:

    您不能将像 vector signed int 这样的 AltiVec 类型视为数组。使用例如将值从数组加载到 AltiVec 向量的 vec_ld 内在函数。

    【讨论】:

    • 如果它们是根据 GNU C 本机向量扩展定义的,那么您可以在 GNU C 中进行定义,如果元素索引使用您想要的元素类型,它甚至会很有用。 (这可能是这里的情况,因为向量声明带有signed int)。 gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html。不过,我认为在 x86 上将标量混洗/混合到向量的元素中至少效率低下,因此如果您不小心避免过多地需要它,那么方便的语法是一个性能陷阱。
    • OP 使用的是 gcc 3.3.2,它已经很老了,虽然 gcc 从 2.95 开始就支持 AltiVec 内在函数,但我认为后来提到的向量扩展。
    • 那个 GCC 版本太老了,他们应该升级它。另外,向量负载在这里真的是一个有用的答案吗?这甚至不是您作为元素插入的一部分所做的事情,是吗? (存储转发停顿在某些 PowerPC 上很糟糕,对,所以矢量存储/标量存储/重新加载与 shuffle 和/或混合很糟糕?)您是否认为他们可能不知道如何开始,并且计划使用它来分别设置所有 4 个元素,基于他们在执行此操作之前没有初始化向量的事实?他们也没有启动int,所以如果这很重要的话,IDK。
    • 是的,我假设 OP 刚刚开始并且不知道如何加载或初始化向量。不幸的是,初始化有不止一种语法(gcc 以一种方式,而其他编译器坚持 AltiVec 规范)所以我避免了那个讨论,只是提到了一个加载内在。
    【解决方案2】:

    为我工作:

    $ cat vec.cpp
    #include <altivec.h>
    void foo () {
      int add = 1;
      vector signed int v_add;
      v_add[0] = add;
    }
    $ g++ -c vec.cpp
    $ g++ --version
    g++ (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1)
    

    【讨论】:

    • OP 使用的是更老的 gcc 工具链 (3.3.2),我怀疑它不支持 AltiVec 类型的数组语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2021-06-03
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2015-04-21
    相关资源
    最近更新 更多