使用位操作可减少缓存开销

问题描述 投票:1回答:1

我必须从每个12位数据中仅使用5位MSB数据,我必须一次采用64位进行高速缓存优化,并使用位操作为每个12位像素获取5个MSB位,我没有得到,我该怎么办?实现这个?这是我编写并正常工作的代码,但不是一次取8位(缓冲区是8位指针),我必须采用64位。在缓冲区中我指出了完整的文件。 *此代码用于制作直方图。

考虑到LITTLE ENDIAN

c bit-manipulation mmap
1个回答
1
投票

64位不是12位的很好的倍数。要解决此问题,请一次读取一组三个64位值(16个像素)。例如。:

    uint64_t v1 = (uint64_t *)(&buffer[pos]);
    uint64_t v2 = (uint64_t *)(&buffer[pos+8]);
    uint64_t v3 = (uint64_t *)(&buffer[pos+16]);

然后你可以立刻做所有的掩饰:

    v1 &= 0x0F80F80F80F80F80ULL;
    v2 &= 0x80F80F80F80F80F8ULL;
    v3 &= 0xF80F80F80F80F80FULL;

对于前5个像素,它只是移动以分离各个像素值(uint16_t MSBs = v1; v1 >>= 12;重复5次)。对于第6个像素,你需要做一些捏造(MSBs = v2 << 4; v2 >>= 8;),然后对于接下来的4个像素,它重新回到MSBs = v2; v2 >>= 12;重复4次。对于之后的像素,它有点捏造(MSBs = v2 | (v3 << 8));然后它只是更多MSBs = v3; v3 >>= 12;重复5次完成16像素组。

请注意,这可能是最快的方式;因为没有分支(并且没有昂贵的分支误预测的可能性),因为CPU可以并行执行大部分操作(特别是如果你完全扩展像素提取以摆脱移位),并且因为“获取和掩码”阶段非常适合SIMD技术。

© www.soinside.com 2019 - 2024. All rights reserved.