小编Pio*_*wak的帖子

将缓冲区中的数据压缩为每个元素16位到12位

我想知道是否有机会提高这种压缩的性能.想法是使高于4095的值饱和,并将每12位的每个值放在新的连续缓冲区中.就像那样:

概念:

兑换:

输入缓冲区:[0.0] [0.1] [0.2] ... [0.15] | [1.0] [1.1] [1.2] ...... [1.15] | [2.0] [2.1] [2.2] ...... [2.15]等......

至:

输出缓冲区:[0.0] [0.1] [0.2] ... [0.11] | [1.0] [1.1] [1.2] ...... [1.11] | [2.0] [2.1] [2.2] ...... [2.11]等......

输入和输出缓冲区定义为:

uint16_t input [76800](字节大小等于153600字节)

uint24_t输出[38400](它的字节大小等于115200字节)

所以我将数据大小减少了1/4.这种计算在Cortex-A9上的成本约为1ms,CPU速度为792 MHz,内核为2.我必须执行这样的"压缩",因为我通过以太网传输大约18MB/s,这给了我巨大的开销.我已经测试过各种压缩算法,例如Snappy,LZ4,并且在饱和度和位漂移的情况下,这些算法甚至都达不到1毫秒.

我写了以下代码:

#pragma pack(push, 1)
typedef struct {
        union {
                struct {
                        uint32_t value0_24x1:24;
                };
                struct {
                        uint32_t value0_12x1:12;
                        uint32_t value1_12x1:12;
                };
                struct {
                        uint32_t value0_8x1:8;
                        uint32_t value1_8x1:8;
                        uint32_t value3_8x1:8;
                };
        };
} uint24_t;
#pragma pack(pop) …
Run Code Online (Sandbox Code Playgroud)

c arm simd neon

7
推荐指数
1
解决办法
1260
查看次数

标签 统计

arm ×1

c ×1

neon ×1

simd ×1