使用Halide进行数据压缩

时间:2019-01-26 11:22:48

标签: halide

我有以下数据压缩算法(对此问题进行了简化)。它包括位操作和输出元素位置(以及总输出大小),取决于先前的输入数据。

void compress_algrorithm(const uint8_t* src, size_t srcsz,
                         uint8_t* dst, size_t& dstsz, uint8_t* flags)
{
        auto srcend = src + srcsz;
        auto q = dst;
        auto r = flags;
        for (auto pp = src; pp < srcend; pp += 4*8) {
                uint8_t f = 0;
                for (int i = 0; i < 8; ++i) {
                        auto p = pp + i*4;
                        if (p[0] < 0x40 && p[1] < 0x40 && p[2] < 0x40 && p[3] < 0x40) {
                                // p[]s are all 6-bit value
                                f |= 1 << i;
                                // compress 6*4 bits (in 4 bytes) into 3 bytes
                                q[0] = p[0] | (p[1] << 6);
                                q[1] = (p[1] >> 2) | (p[2] << 4);
                                q[2] = (p[2] >> 4) | (p[3] << 2);
                                q += 3;
                        } else {
                                // if not, just copy
                                q[0] = p[0];
                                q[1] = p[1];
                                q[2] = p[2];
                                q[3] = p[3];
                                q += 4;
                        }
                }
                *r++ = f;
        }
        dstsz = q - dst;
}

是否可以在Halide中表达此算法?

0 个答案:

没有答案