执行“uint8x8x4_t - 128”然后将其除以 2
Posted
技术标签:
【中文标题】执行“uint8x8x4_t - 128”然后将其除以 2【英文标题】:Doing "uint8x8x4_t - 128" then divising this by 2 【发布时间】:2013-06-25 03:31:51 【问题描述】:对于如何在特定情况下通过 Neon 上的标量实现除法,我有些困惑。
在 c++ 上下文中,我使用非常基本的算法实现了对比效果:
if (currentEffect == "contrast_with_cpp")
r += ((r - 128) / 2);
g += ((g - 128) / 2);
b += ((b - 128) / 2);
我想将此算法移植到 neon 内部函数。
我已经尝试过,但我对这种方法完全是新手,我无法在 Visual Studio 中调试此代码。它在启动时编译并集成到 Windows Phone 应用程序中。
if (currentEffect == "contrast_with_neon") /* Experimental, not working *
// To test
copy_rgb = rgb;
// Substract 128 from the copy, prevent it should be a signed variable
?
// Get half value from copy and put it in another copy
uint8x8x4_t otherCopy = interleaved;
otherCopy.val[2] = vmul_n_f32(copy_rgb.val[2], 0.5);
otherCopy.val[1] = vmul_n_f32(copy_rgb.val[1], 0.5);
otherCopy.val[0] = vmul_n_f32(copy_rgb.val[0], 0.5);
// Add it to the first copy
copy_rgb.val[2] = vadd_u8(copy_rgb.val[2], otherCopy.val[2]);
copy_rgb.val[1] = vadd_u8(copy_rgb.val[2], otherCopy.val[1]);
copy_rgb.val[0] = vadd_u8(copy_rgb.val[2], otherCopy.val[0]);
rgb = copy_rgb;
这可以使用内在函数实现吗?
[编辑] 我猜颜色数据结构类似于this
【问题讨论】:
【参考方案1】:停止在内在函数上浪费时间。这真的很痛苦,尤其是使用 gcc。
在汇编中试试这个:
vmov.i16 qMdeian, #128 // put this line outside of loop
// -----------------------------------------------
vmovl.u8 qRed, dRed
vmovl.u8 qGrn, dGrn
vmovl.u8 qBlu, dBlu
vsub.s16 qRedTemp, qRed, qMedian
vsub.s16 qGrnTemp, qGrn, qMedian
vsub.s16 qBluTemp, qBlu, qMedian
vshr.s16 qRedTemp, #2
vshr.s16 qGrnTemp, #2
vshr.s16 qBluTemp, #2
vadd.s16 qRed, qRedTemp
vadd.s16 qGrn, qGrnTemp
vadd.s16 qBlu, qBluTemp
vqmovun.s16 dRed, qRed
vqmovun.s16 dGrn, qGrn
vqmovun.s16 dBlu, qBlu
如果确实在 255 处饱和,并且任何负值都将变为零,我认为这是有意的。
PS : 你用 float 做什么?
【讨论】:
哦,谢谢你的建议。但是我猜执行时间速度会有所不同吗?在我只使用 128 位霓虹灯操作的情况下,我目前以 15 fps 的速度工作。 普通 C++ 以 8-9 fps 的速度下降。 关于浮点数,它只是随机放置一个可以无错误编译的强制转换,而不是实际代码,因为我应该乘以一个字节然后>>右移。以上是关于执行“uint8x8x4_t - 128”然后将其除以 2的主要内容,如果未能解决你的问题,请参考以下文章
如何执行两个 Axios GET 请求,映射结果然后将其推送到数组?
如何在 MapView 上点击然后将其传递给默认手势识别器?