首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量中的Neon交换元素

向量中的Neon交换元素
EN

Stack Overflow用户
提问于 2016-09-15 15:29:16
回答 1查看 1.9K关注 0票数 1

我想用Neon Intrinsics优化这样的代码。基本上在给定的输入下

0 1 2 3 4 5 6 7

会产生输出,

2 1 0 5 4 3 8 7 6

代码语言:javascript
复制
void func(uint8_t* src, uint8_t* dst, int size){

   for (int i = 0; i < size; i++){
     dst[0] = src[2];
     dst[1] = src[1];
     dst[2] = src[0]
     dst = dst+3;
     src = src+3;
   }           
}

我唯一能想到的方法就是

代码语言:javascript
复制
uint8x8x3_t src = vld3_u8(src);

获取3个向量,然后访问src2、src1、src中的每个单个元素并写入内存。

有人能帮忙吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 20:01:07

这在底层指令集中非常容易,因为您正在交换一个3元素结构的两个元素,这实际上已经说明了相关的指令:

代码语言:javascript
复制
vld3.u8 {d0-d2}, [r0]
vswp d0, d2
vst3.u8 {d0-d2}, [r0]

甚至在霓虹灯程序员指南中也有这样的例子,因为它是RGB转换,而这正是为处理霓虹灯而设计的。

对于本质,它要复杂一些,因为vswp没有固有的特性;您只需用C来表示它,并相信编译器会做正确的事情:

代码语言:javascript
复制
uint8x8x3_t data = vld3_u8(src);
uint8x8_t tmp = data.val[0];
data.val[0] = data.val[2];
data.val[2] = tmp;
vst3_u8(dest, data);

尽管如此,由于编译器是GCC的不同版本,我未能说服他们中的任何一个真正发出一个从次优到愚蠢的vswp代码生成。Clang做得更好,但仍然没有vswp;其他编译器可能更聪明。

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

https://stackoverflow.com/questions/39514952

复制
相关文章

相似问题

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