uint32按16组uint2位对分组模4求和的高效无分支并行算法问询
更高效的uint32位对模4求和算法
原算法通过15次右移累加再取低两位的方式计算,操作次数多,并行执行效率有限。可以用分治并行累加的方式大幅减少操作步骤,同时完全满足无分支、并行可执行的要求:
优化算法实现
uint32_t temp = x + (x >> 2); temp &= 0x33333333; // 保留每两位的局部和,避免跨位干扰 temp = temp + (temp >> 4); temp &= 0x0F0F0F0F; // 合并相邻两组,保留每4位的局部和 temp = temp + (temp >> 8); temp &= 0x00FF00FF; // 合并相邻字节,保留每8位的局部和 temp = temp + (temp >> 16); uint32_t result = temp & 3; // 最终取低两位得到总和模4
算法核心优势
- 操作量骤减:仅需4次移位、4次加法、3次掩码操作,远少于原算法的15次移位+加法组合
- 无分支特性:所有操作均为位运算和算术运算,无任何条件跳转指令
- 并行适配性:每一步的移位、加法、掩码都是对32位数据的全局操作,可直接利用CPU的位并行能力(如SIMD指令集加速)
原理说明
该算法基于分治思想逐步合并局部和:
- 第一步将每两个相邻uint2位对的和存储在原位置,用
0x33333333掩码确保每组和仅占用两位,不会干扰其他组 - 后续步骤依次合并更大的块,每次合并后用掩码限制位范围,避免进位溢出到其他块
- 最终合并所有块的和后,取低两位即为16个uint2位对总和的模4结果(总和最大为16×3=48,48模4的结果仅需低两位表示)
内容的提问来源于stack exchange,提问作者Nicolas Malebranche
相关产品推荐
相关产品推荐

