首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于NEON本质的优化

基于NEON本质的优化
EN

Stack Overflow用户
提问于 2016-02-10 10:51:45
回答 1查看 719关注 0票数 1

我非常熟悉霓虹灯的内在特性。我正在努力优化下面的算法

代码语言:javascript
复制
    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位。

有人能帮我解决这个问题吗?

我能够把它们转换成保罗的链接所建议的32位,并做必要的算术。现在我有:

代码语言:javascript
复制
           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通道并将其放回目的地?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-11 06:28:43

我还没有对算法有深入的理解,但是当然您可以使用NEON优化它:

代码语言:javascript
复制
uint32_t blue = 0, red = 0, green = 0, alpha = 0, factor = 0, shift = 0;
// some your initializations.
uint32x4_t bgra = { blue, green, red, alpha };
for (int i = 0; i < count; i += 2)
{
    //load 8 8-bit values and unpack to 16-bit
    uint16x8_t src = vmovl_u8(vld1_u8(psrc + i * 4)); 

    //accumulate low 4 values
    bgra = vaddw_u16(bgra, vget_low_u16(src));
    //get low 4 values of dst
    uint32x4_t lo = vshrq_n_u32(vmulq_u32(bgra, vdupq_n_u32(factor)), shift);

    //accumulate high 4 values
    bgra = vaddw_u16(bgra, vget_high_u16(src));
    //get high 4 values of dst
    uint32x4_t hi = vshrq_n_u32(vmulq_u32(bgra, vdupq_n_u32(factor)), shift);

    //pack 8 32-bit values to 8 8-bit.
    uint8x8_t dst = vmovn_u16(vcombine_u16(vmovn_u32(lo), vmovn_u32(hi)));

    //store result
    vst1_u8(pDest + i * 4, dst);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35313160

复制
相关文章

相似问题

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