【发布时间】:2016-05-20 16:25:24
【问题描述】:
我是 NEON 内在的初学者。我正在尝试优化下面的算法
uint32_t blue = 0, red = 0 , green = 0, alpha = 0, factor = 0 , shift = 0;
// some initial calculation to calculate factor shift and R G B init values all are expected to be initilized with 16 bit unsigned
//pSRC is 32 bbp flat pixel array and count is total pixels count
for( int i = 0; i < count; i++ )
{
blue += *psrc++;
green += *psrc++;
green += *psrc++;
alpha += *psrc++;
*pDest++ = static_cast< uint_8 >( ( blue * factor ) >> shift );
*pDest++ = static_cast< uint_8 >( ( green * factor ) >> shift );
*pDest++ = static_cast< uint_8 >( ( red * factor ) >> shift );
*pDest++ = static_cast< uint_8 >( ( alpha * factor ) >> shift );
}
我不确定如何执行此操作,因为我需要 32 位容器中的结果,并且我的源数据为 8 位 ( R G B A ),并且没有可以将 8 位与 32 位相加的指令。
谁能帮我解决这个问题?
按照 Paul 的链接的建议,我能够将它们转换为 32 位并进行必要的算术运算。现在我有:
uint32x4_t result1 = vshlq_u32(mult1281, shift);
uint32x4_t result2 = vshlq_u32(mult1282, shift);
uint32x4_t result3 = vshlq_u32(mult1283, shift);
uint32x4_t result4 = vshlq_u32(mult1284, shift);
结果 1/2/3/4 现在包含 32 位(每通道)RGB 通道。我现在如何组合结果 1/2/3/4 以获得 8 位(每通道)RGB 通道并将其放回目的地?
【问题讨论】:
-
我不明白这个算法是做什么的。值(蓝色、绿色、红色、alpha)将一直上升。 *pDst 可以周期性溢出 8 位。
-
还有一个转变,它本质上是一个设计,所以我认为它不会溢出
-
即使有了转变,它仍然是一个持续的积累。写入在循环内,累加器永远不会重置或减少,因此输出是一个不断增长的值。你也说了两次
green...你的意思是blue,对吧? -
是的,我的意思是蓝色..我同意这是连续累积,但我们将 8 位数字(*psrc)添加到 32 位数字(比如红色)初始化为 16 位(代码注释中提到)数字所以我看不到任何溢出问题,除非计数太大或者我在这里遗漏了什么?
标签: c arm simd neon intrinsics