我需要将无符号字符图像(640x480x1)或更小的图像转换为浮点图像进行处理。在这种情况下,由于问题的复杂性,我不能进行定点计算。我目前使用霓虹灯的过程分为两步。霓虹灯可以相当快地将整数转换为浮点型,但不能将无符号字符转换为浮点型。
1)使用LUT将无符号字符图像转换为整数图像(由于我知道范围,因此不进行泛型转换) 2)使用霓虹灯将整数转换为浮点数
这个过程大约需要10-15毫秒的时间来准备图像进行处理。
我也可以在第一步中使用LUT直接转换为浮点数。然而,我发现这样做比使用从整型到浮点型的霓虹灯需要更长的时间。所以我实际上想使用霓虹灯将无符号字符直接转换为浮点数,并摆脱第一步。
有谁知道更好的方法吗?
发布于 2011-06-18 09:08:12
编辑:“无符号字符到整数的转换”只涉及在正确的位置添加一些零字节。最明显的方法是执行必要的移位,然后执行VDUP以清除向量,并执行VMOV.U8四次。这看起来有点慢。
更快的方法可能是使用VTBL
; load stuff into D4 (e.g. {6,7,8,9,a,b,c,d})
; D5 already contains {0,-1,-1,-1,1,-1-1-1}
; D6 already contains {2,-1,-1,-1,3,-1-1-1}
; D7 and D8 are similar...
vtbl.8 D0,{D4},D5
vtbl.8 D1,{D4},D6
vtbl.8 D2,{D4},D7
vtbl.8 D3,{D4},D8
; Now Q0 should contain {6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0}; similarly for Q1
; Interpret them as (little-endian) 32-bit ints and convert them to floats
vcvt.f32.u32 Q0,Q0,#0
vcvt.f32.u32 Q1,Q1,#0
; And save them somewhere当然,您可以指定#8而不是#0来将所有内容除以256。
我没有看到VTBL的四字版本,但这样的重写不会太难。明显的扩展是将四字加载到Q2 = { D4,D5}中,然后重复这个过程,指定D4而不是D5 (或者使用更多的寄存器来避免数据依赖停滞)。
其他优化包括预加载缓存(我忘记了对应的ARM指令是什么)。一般来说,您可能会发现,如果不投入大量的精力,就很难击败Accelerate.framework。
发布于 2013-06-06 15:23:22
另一种更紧凑的方法是:
; load stuff into D4 (e.g. {6,7,8,9,a,b,c,d})
vmovl.u8 q1, d4
vmovl.u16 q0, d2
vmovl.u16 q1, d3
; Now Q0 should contain {6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0}; similarly for Q1
; Interpret them as (little-endian) 32-bit ints and convert them to floats
vcvt.f32.u32 Q0,Q0,#0
vcvt.f32.u32 Q1,Q1,#0
; And save them somewherehttps://stackoverflow.com/questions/6392635
复制相似问题