You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求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]; ~500ms
  • c[i] = std::abs(a[i] - b[i]); ~800ms
  • c[i] = ((a[i] - b[i]) + ((a[i] - b[i]) >> 15)) ^ (i >> 15); ~425ms
  • uint16_t tmp = (a[i] - b[i]); c[i] = tmp * ((tmp > 0) - (tmp < 0)); ~600ms
  • uint16_t ret[2] = { a[i] - b[i], b[i] - a[i] };c[i] = ret[a[i] < b[i]]; ~900ms
  • c[i] = ((a[i] - b[i]) >> 31 | 1) * (a[i] - b[i]); ~375ms
  • c[i] = ((a[i] - b[i])) ^ ((a[i] - b[i]) >> 15); ~425ms

内容的提问来源于stack exchange,提问作者ElectronicsStudent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:41:19