如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器
Posted
技术标签:
【中文标题】如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器【英文标题】:How to initialize a AltiVec register from scalars without using compound literals 【发布时间】:2018-03-16 16:07:52 【问题描述】:我有一些这样的代码
void op(uint32_t B0, uint32_t B1, uint32_t B2, uint32_t B3)
auto v = (__vector unsigned int)B0, B1, B2, B3;
...
当我编译它时,GCC 会警告说“ISO C++ 禁止复合文字”。有没有其他方法可以在没有此构造的情况下从多个标量初始化 AltiVec __vector
?还是我应该忽略警告。
我发现一些 IBM 文档表明 (__vector unsigned int)(B[0], B[1], B[2], B[3])
(注意括号而不是括号)可以工作,但 GCC 拒绝这样做。
我唯一能想到的另一件事是首先将四个标量放入一个数组中,然后从内存中加载它。但是,这似乎会比较慢。我基本上是在寻找相当于 SSE2 的 _mm_set_epi32
内在函数。
【问题讨论】:
【参考方案1】:在过去有两种不同的语法,这两种方法都值得一试:
__vector unsigned int v = (__vector unsigned int) B0, B1, B2, B3 ; // gcc syntax
和
__vector unsigned int v = (__vector unsigned int)(B0, B1, B2, B3); // Motorola syntax
看起来您已经尝试过“gcc”语法(除了使用auto
),但也许摩托罗拉语法可能有效?
如果摩托罗拉语法不起作用,我可以提出的唯一其他建议是尝试使用 gcc 语法,但将其编译为 C 而不是 C++,因为现在 C++11 和 gcc 样式之间可能存在一些冲突AltiVec 初始化程序。
【讨论】:
遗憾的是,摩托罗拉语法在 C++ 中不起作用,并且由于所讨论代码的性质(它充当 C++ 代码的 SSE2/AltiVec/NEON 寄存器的 100% 内联包装器),它是无法从 C 编译它;在此处添加函数调用开销会严重影响性能。 你能用 IBM 编译器 (xlC) 代替 gcc 吗?以上是关于如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器的主要内容,如果未能解决你的问题,请参考以下文章
可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?
如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?