寻求C/C++优化方案:高效计算uint16_t时间序列绝对差值
高效计算两个uint16_t时间序列的绝对差值
需求概述
需要实现高效的C/C++代码,计算两个长度固定为128的uint16_t类型时间序列的逐元素绝对差值。具体要求:
设A、B、C为长度l=128的
uint16_t离散时间序列,对所有n<128,满足C[n] = |A[n] - B[n]|
初始实现
我最初的实现是循环加条件判断的形式:
for(uint8_t idx = 0; idx < 128; idx++){ c[idx] = a[idx] > b[idx] ? a[idx] - b[idx] : b[idx] - a[idx]; }
也可以通过编译器指令做循环展开优化:
void getBufDiff(const uint16_t (&a)[128], const uint16_t (&b)[128], uint16_t (&c)[128]) { #pragma unroll 16 for (uint8_t i = 0; i < 128; i++) { c[i] = a[i] > b[i] ? a[i] - b[i] : b[i] - a[i]; } #pragma unroll }
但我不想保留循环内的条件判断逻辑,希望找到无分支的位运算实现来替代if/else以提升性能。我可以接受±1的精度误差,也允许修改数据类型或替换循环实现方式。理想实现形式如下:
void getBufDiff(const uint16_t (&a)[128], const uint16_t (&b)[128], uint16_t (&c)[128]) { #pragma unroll 16 for (uint8_t i = 0; i < 128; i++) { c[i] = magic_code_for_abs_diff(a[i],b[i]); } #pragma unroll }
我尝试过异或操作,但仅在部分场景下能得到正确结果。
性能测试结果
我在笔记本上针对2.5亿个元素(256轮循环)做了不同实现的性能测试,结果如下:
c[i] = a[i] > b[i] ? a[i] - b[i] : b[i] - a[i];~500msc[i] = std::abs(a[i] - b[i]);~800msc[i] = ((a[i] - b[i]) + ((a[i] - b[i]) >> 15)) ^ (i >> 15);~425msuint16_t tmp = (a[i] - b[i]); c[i] = tmp * ((tmp > 0) - (tmp < 0));~600msuint16_t ret[2] = { a[i] - b[i], b[i] - a[i] };c[i] = ret[a[i] < b[i]];~900msc[i] = ((a[i] - b[i]) >> 31 | 1) * (a[i] - b[i]);~375msc[i] = ((a[i] - b[i])) ^ ((a[i] - b[i]) >> 15);~425ms
内容的提问来源于stack exchange,提问作者ElectronicsStudent
相关产品推荐
相关产品推荐

