gpt4 book ai didi

iphone - 如何使用 NEON 在 ARM 汇编中实现 16 位->32 位查找表?

转载 作者:行者123 更新时间:2023-12-03 16:54:43 29 4
gpt4 key购买 nike

在 iOS 6 项目中,我有一个包含两个字节字(16 位)的缓冲区,需要通过查找表将其转换为四个字节字(32 位)。我将这些值硬编码到表中,然后使用两个字节缓冲区的值来确定要检索哪个 32 位表值。这是一个例子:

void map_values(uint32_t *dst,uint16_t *src,uint32_t *lut,int buf_length){
int i=0;
for(i=0;i<buf_length;i++){

*dst = *(lut+(*src));
dst++;
src++;
}
}

问题是,它太慢了。使用 NEON 一次处理 4 个输出字节是否可以加快速度?问题是,我不确定如何从 src 缓冲区中获取值并将其用作查找表的输入来找出要检索的值。此外,表和输出缓冲区中的字长相同,但源中的字长不同。因此,我只能读取两个 16 位字作为输入,而需要读取四个 32 位字输出。有任何想法吗?也许有更好的方法来解决这个问题吗?

clang 的当前 asm 输出(clang -O3 -arch armv7 lut.c -S):

    .section    __TEXT,__text,regular,pure_instructions
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
.section __TEXT,__const_coal,coalesced
.section __TEXT,__picsymbolstub4,symbol_stubs,none,16
.section __TEXT,__StaticInit,regular,pure_instructions
.syntax unified
.section __TEXT,__text,regular,pure_instructions
.globl _map_values
.align 2
.code 16 @ @map_values
.thumb_func _map_values
_map_values:
@ BB#0:
cmp r3, #0
it eq
bxeq lr
LBB0_1: @ %.lr.ph
@ =>This Inner Loop Header: Depth=1
ldrh r9, [r1], #2
subs r3, #1
ldr.w r9, [r2, r9, lsl #2]
str r9, [r0], #4
bne LBB0_1
@ BB#2: @ %._crit_edge
bx lr


.subsections_via_symbols

最佳答案

查找表(几乎)是不可向量化的。非常小的查找表可以使用 vtbl 指令处理,但您的查找表太大了。

您使用查找表做什么?如果可以即时计算这些值而不需要太多工作而不是查找它们,那么这实际上对您来说可能是一个重大胜利。

关于iphone - 如何使用 NEON 在 ARM 汇编中实现 16 位->32 位查找表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14776665/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com