当前位置: 首页 > article >正文

高效计算汉明权重的VP-SWAR算法解析与优化实践

1. 汉明权重的核心概念与应用场景汉明权重Hamming Weight听起来像是个高大上的专业术语但其实它的定义非常简单——就是统计一个二进制数中1的个数。比如二进制数1011的汉明权重就是3因为里面有3个1。这个概念最早由理查德·汉明提出在信息论、密码学、数据压缩等领域都有广泛应用。我在处理大规模数据时经常遇到需要快速计算汉明权重的场景。比如在开发一个实时数据处理系统时需要快速统计数百万个64位整数中1的个数这时候一个高效的算法就能带来巨大的性能提升。传统的方法是逐个比特检查但对于现代CPU处理的大数据量来说这种方法效率太低。汉明权重计算在现实中有很多实际应用。比如在开发布隆过滤器时需要统计哈希值的1的个数在图像处理中计算两个二进制图像的差异在机器学习领域计算特征向量的稀疏度等等。这些场景都对计算速度有很高要求这正是VP-SWAR算法大显身手的地方。2. VP-SWAR算法的核心原理VP-SWARVariable-Precision SIMD Within A Register算法是一种基于分治思想的位运算技巧。它的核心思路是把一个长整数的二进制表示分成若干组通过巧妙的位移和位运算在常数时间内并行计算多组的1的个数最后合并结果。我第一次看到这个算法时就被它的巧妙设计震撼了。它不需要任何循环仅用几次位运算就能完成计算。让我们用一个8位二进制数xabcdefgh来理解这个过程第一步我们把每2位分成一组用掩码010101010x55分别获取奇数位和偶数位的1的个数然后相加。这样就得到了4个2位数每个数表示原始数中对应2位的1的个数。第二步我们把每4位分成一组用掩码001100110x33将相邻的两个2位结果相加得到2个4位数每个表示原始数中对应4位的1的个数。第三步我们再把8位作为一组用掩码000011110x0F将两个4位结果相加最终得到整个8位数的1的个数。这种分治策略可以扩展到16位、32位甚至64位数。算法的时间复杂度是O(1)因为它只进行固定次数的位运算与输入数的位数无关。3. VP-SWAR算法的具体实现让我们来看一个完整的64位VP-SWAR实现。这个版本是我在实际项目中使用过的经过多次优化const uint64_t m1 0x5555555555555555; // 01010101... const uint64_t m2 0x3333333333333333; // 00110011... const uint64_t m4 0x0f0f0f0f0f0f0f0f; // 00001111... const uint64_t m8 0x00ff00ff00ff00ff; // 0000000011111111... const uint64_t m16 0x0000ffff0000ffff; // 16个0,16个1... const uint64_t m32 0x00000000ffffffff; // 32个0,32个1 const uint64_t h01 0x0101010101010101; // 用于最后的求和 int popcount_swar(uint64_t x) { x - (x 1) m1; // 每2位存放这2位中1的个数 x (x m2) ((x 2) m2); // 每4位存放这4位中1的个数 x (x (x 4)) m4; // 每8位存放这8位中1的个数 x (x * h01) 56; // 将所有字节的和累加到最高字节 return (int)x; }这个实现有几个优化点值得注意第一步使用了一个技巧x - ((x 1) m1)可以替代(x m1) ((x 1) m1)减少了一次位运算在8位阶段直接用(x (x 4)) m4替代了分开与掩码相与的操作最后用乘法代替了多次移位相加这个技巧很巧妙乘以0x0101010101010101相当于把所有字节的值累加到最高字节4. 算法优化技巧与性能对比在实际应用中VP-SWAR算法还可以进一步优化。我在不同平台上测试过多种实现总结出以下几点经验平台特定优化现代CPU通常有专门的popcount指令如x86的POPCNT在支持这些指令的平台上直接使用内联汇编或编译器内置函数性能最好。但在不支持这些指令的平台上VP-SWAR仍然是最佳选择。// 使用GCC内置函数 int popcount_builtin(uint64_t x) { return __builtin_popcountll(x); }数据分布优化如果数据中0比较多可以采用另一种算法它每次清除最低位的1直到数变为0int popcount_sparse(uint64_t x) { int count 0; while (x) { count; x x - 1; // 清除最低位的1 } return count; }查表法对于固定位宽的数据可以预先计算所有可能值的汉明权重使用时直接查表。这种方法速度最快但会占用额外内存。static const uint8_t bits_in_byte[256] { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4, // ... 完整256个值的表 }; int popcount_lookup(uint64_t x) { return bits_in_byte[x 0xFF] bits_in_byte[(x 8) 0xFF] bits_in_byte[(x 16) 0xFF] bits_in_byte[(x 24) 0xFF] bits_in_byte[(x 32) 0xFF] bits_in_byte[(x 40) 0xFF] bits_in_byte[(x 48) 0xFF] bits_in_byte[(x 56) 0xFF]; }性能测试结果显示在x86平台上对于随机分布的64位数内置POPCNT指令约1.5 cycles/callVP-SWAR算法约3 cycles/call查表法约5 cycles/call稀疏数据算法取决于1的个数每个1约3 cycles5. 实际应用中的注意事项在实际项目中使用VP-SWAR算法时我踩过几个坑这里分享给大家字节序问题VP-SWAR算法是独立于字节序的因为位运算是在整数的二进制表示上操作的。但在调试时要注意打印出的十六进制数在不同字节序的机器上看起来可能不同。编译器优化现代编译器能识别常见的汉明权重计算模式可能会自动优化为最佳实现。比如GCC在-O2优化级别下会把简单的循环实现转换为POPCNT指令。可移植性如果代码需要在多种平台上运行最好提供多种实现并在运行时检测CPU特性选择最优的实现。比如int popcount(uint64_t x) { #ifdef __POPCNT__ return __builtin_popcountll(x); #else // VP-SWAR实现 #endif }测试覆盖要特别注意边界条件的测试比如全0、全1、交替01等情况。我曾经因为没测试全0的情况导致一个线上bug。性能权衡在数据量不大时算法的选择对整体性能影响不大。但在处理海量数据时选择最优算法能带来显著提升。我曾经通过将查表法改为VP-SWAR使一个数据处理任务的运行时间从15分钟缩短到8分钟。

相关文章:

高效计算汉明权重的VP-SWAR算法解析与优化实践

1. 汉明权重的核心概念与应用场景 汉明权重(Hamming Weight)听起来像是个高大上的专业术语,但其实它的定义非常简单——就是统计一个二进制数中1的个数。比如二进制数1011的汉明权重就是3,因为里面有3个1。这个概念最早由理查德汉…...

告别环境冲突!用Anaconda在PyCharm里为PyTorch项目创建独立的CUDA环境(保姆级图文)

深度学习工程师的终极武器:用Anaconda打造PyTorch项目的完美隔离环境 当你在深夜调试一个关键模型时,突然发现项目B的代码在项目A的环境中莫名其妙报错——这种场景对深度学习工程师来说再熟悉不过了。环境冲突就像编程世界里的"量子纠缠"&…...

轻流无代码如何重构质量管理体系?这 3 个价值必须了解

轻流无代码如何重构质量管理体系?这 3 个价值必须了解如果用一句话概括轻流 AI 无代码平台在质量管理场景的价值,那就是:让业务人员自主搭建管理系统,无需编写代码,1-2 周即可上线核心功能,总体拥有成本降低…...

终极指南:Microsoft BASIC M6502 字符串处理技术解析

终极指南:Microsoft BASIC M6502 字符串处理技术解析 【免费下载链接】BASIC-M6502 Microsoft BASIC for 6502 Microprocessor - Version 1.1 项目地址: https://gitcode.com/gh_mirrors/ba/BASIC-M6502 Microsoft BASIC for 6502 Microprocessor&#xff08…...

交期延误?轻流 AI 无代码给出新解法

交期延误?轻流 AI 无代码给出新解法早上 8 点,生产例会上,生产经理再次被问到:"昨天的计划为什么又没完成?"这已经是本周第三次了。计划赶不上变化、进度不透明、延期率高——这些问题像三座大山&#xff0c…...

终极指南:DefectDojo API v2开发实战 — 构建定制化安全解决方案

终极指南:DefectDojo API v2开发实战 — 构建定制化安全解决方案 【免费下载链接】django-DefectDojo Open-Source Unified Vulnerability Management, DevSecOps & ASPM 项目地址: https://gitcode.com/gh_mirrors/dj/django-DefectDojo DefectDojo是一…...

【IET出版】第十一届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2026)

第十一届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2026)将于2026年6月12-14日在中国昆明举行。 ISCTT 2026将围绕“信息科学”、"计算机技术”、“交通运输”等最新研究领域,为来自国内外高等院校、科学研究所、企事业单位的…...

终极指南:Google Cloud Go 客户端库的版本管理与向后兼容策略

终极指南:Google Cloud Go 客户端库的版本管理与向后兼容策略 【免费下载链接】google-cloud-go Google Cloud Client Libraries for Go. 项目地址: https://gitcode.com/GitHub_Trending/go/google-cloud-go Google Cloud Client Libraries for Go 是连接 G…...

vLLM-v0.17.1惊艳效果:AWQ量化后Llama3-8B显存占用降至11GB

vLLM-v0.17.1惊艳效果:AWQ量化后Llama3-8B显存占用降至11GB 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的速度和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在已经发展…...

如何使用EasyMocap实现精准人体关键点检测与3D运动捕捉:从2D到3D的完整指南

如何使用EasyMocap实现精准人体关键点检测与3D运动捕捉:从2D到3D的完整指南 【免费下载链接】EasyMocap Make human motion capture easier. 项目地址: https://gitcode.com/gh_mirrors/ea/EasyMocap EasyMocap是一款强大的开源人体运动捕捉工具&#xff0c…...

如何解决宝塔面板7.x升级到8.x后部分插件不兼容报错_在插件商店重装受影响插件以适配新Python环境

重装插件无效是因为宝塔8.x改用独立Python 3.9环境(/www/server/pyenv),而老插件仍硬编码调用系统python或旧pip,导致模块缺失、解释器找不到等错误;须手动将所有python路径替换为/www/server/pyenv/versions/3.9/bin/…...

如何优化AutoTrain Advanced多模态模型部署:模型拆分与推理加速完整指南

如何优化AutoTrain Advanced多模态模型部署:模型拆分与推理加速完整指南 【免费下载链接】autotrain-advanced 🤗 AutoTrain Advanced 项目地址: https://gitcode.com/gh_mirrors/au/autotrain-advanced AutoTrain Advanced是一款功能强大的多模态…...

RudderStack部署实战:从Docker到Kubernetes的完整指南

RudderStack部署实战:从Docker到Kubernetes的完整指南 【免费下载链接】rudder-server Privacy and Security focused Segment-alternative, in Golang and React 项目地址: https://gitcode.com/gh_mirrors/ru/rudder-server RudderStack是一款注重隐私与安…...

2026最权威的十大AI辅助论文网站横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要降低AI生成文本获得辨识度的可能性,得从词汇、句法以及逻辑这三个方面着手进行…...

终极Jellyfin Media Player Qt WebEngine优化指南:10个提升播放性能的实用技巧

终极Jellyfin Media Player Qt WebEngine优化指南:10个提升播放性能的实用技巧 【免费下载链接】jellyfin-desktop-qt Jellyfin Desktop Client 项目地址: https://gitcode.com/GitHub_Trending/je/jellyfin-desktop-qt Jellyfin Desktop Client是一款功能强…...

华硕A豆14 I421E 原厂Win10 20H2系统 分享下载

华硕A豆14 I421E笔记本自带一键恢复功能,即使系统出现异常或用户自行重装/更换硬盘后导致恢复功能失效,也能通过原厂提供的工厂文件轻松恢复至出厂设置。支持的型号包括I421EA, I421EQ, I421EAY和I421EQY。预装的是Windows 10 20H2家庭版系统&#xff0c…...

5分钟掌握sakura.css暗色模式:打造现代网站的终极视觉体验

5分钟掌握sakura.css暗色模式:打造现代网站的终极视觉体验 【免费下载链接】sakura :cherry_blossom: a minimal css framework/theme. 项目地址: https://gitcode.com/gh_mirrors/sa/sakura sakura.css是一款极简的CSS框架,它提供了优雅的暗色模…...

迎战2026最严查重:DeepSeek联动知网报告,手把手带你稳降论文AI率

最近学术圈有个大动作,不知道大家发现没——知网的AIGC检测算法又升级了。 这就导致一个很尴尬的现象:哪怕是你一个字一个字熬夜敲出来的,只要逻辑太顺、用词太标准,大概率也会被标红。现在想找个靠谱的aigc免费降重方法&#xff…...

KubeBlocks SQL Server(MSSQL) Kubernetes Operator 高可用实现

KubeBlocks SQL Server(MSSQL) K8s Operator 高可用实现 背景 Microsoft SQL Server(MSSQL)是由微软开发的一款关系型数据库管理系统。最初仅支持在 Windows 平台上运行,自 2017 版本起开始支持 Linux 系统,这一变化为 MSSQL 的…...

【零成本降AI】别盲目改论文!基于知网报告的DeepSeek降AI实操(附神级提示词)

最近学术圈有个大动作,不知道大家发现没——知网的AIGC检测算法又升级了。 这就导致一个很尴尬的现象:哪怕是你一个字一个字熬夜敲出来的,只要逻辑太顺、用词太标准,大概率也会被标红。现在想找个靠谱的aigc免费降重方法&#xff…...

直击知网5.0新规!读懂知网报告配合DeepSeek两步降论文AI(附三款降AI工具测评)

最近学术圈有个大动作,不知道大家发现没——知网的AIGC检测算法又升级了。 这就导致一个很尴尬的现象:哪怕是你一个字一个字熬夜敲出来的,只要逻辑太顺、用词太标准,大概率也会被标红。现在想找个靠谱的aigc免费降重方法&#xff…...

双重机器学习DML介绍

本文参考: [1]我在开始团做运筹_DML 一、核心原理与数学框架 双重机器学习(Double Machine Learning, DML)由Chernozhukov等学者于2018年提出,是一种结合机器学习与传统计量经济学的因果推断框架。其核心目标是在高维数据和非线…...

Rocket.Chat终极安全指南:区块链技术如何重塑企业通信安全

Rocket.Chat终极安全指南:区块链技术如何重塑企业通信安全 【免费下载链接】Rocket.Chat The Secure CommsOS™ for mission-critical operations 项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat Rocket.Chat是一款开源、安全且完全可定制的…...

2026奇点大会AIAgent自动驾驶核心白皮书首发(仅限前500名技术决策者获取)

第一章:2026奇点智能技术大会:AIAgent自动驾驶概览 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,AIAgent自动驾驶系统首次以全栈协同架构形态公开演示,标志着从感知决策分离模型向多智能体协同推理范…...

50ms消息响应革命:Rocket.Chat边缘计算部署实战指南

50ms消息响应革命:Rocket.Chat边缘计算部署实战指南 【免费下载链接】Rocket.Chat The Secure CommsOS™ for mission-critical operations 项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat 你是否还在忍受跨国团队消息延迟超过3秒&#xff1…...

Rocket.Chat移动端终极优化指南:打造完美响应式聊天体验

Rocket.Chat移动端终极优化指南:打造完美响应式聊天体验 【免费下载链接】Rocket.Chat The Secure CommsOS™ for mission-critical operations 项目地址: https://gitcode.com/GitHub_Trending/ro/Rocket.Chat 在当今移动优先的数字时代,Rocket.…...

ESP32-CAM的SD卡能跑多快?实测SDMMC 4线模式下的文件读写性能与优化

ESP32-CAM SD卡性能深度优化:从SDMMC配置到文件系统选型实战 在物联网边缘计算场景中,ESP32-CAM凭借其出色的图像采集能力和紧凑的硬件设计,成为众多嵌入式视觉项目的首选。然而当涉及到持续拍摄高分辨率图像或长时间记录传感器数据时&#x…...

专知智库白皮书(一):什么是余行税?企业隐形生存税的定义与本质

专知智库白皮书(一):什么是余行税?企业隐形生存税的定义与本质在红海竞争加剧、经济周期波动、技术迭代加速的今天,企业面临的最大威胁往往不是效率低下,而是方向迷失。传统的管理工具解决“做得快不快”&a…...

SopCastComponent实战案例:构建你的第一个Android直播应用

SopCastComponent实战案例:构建你的第一个Android直播应用 【免费下载链接】SopCastComponent 该项目不再维护,仅供学习参考 项目地址: https://gitcode.com/gh_mirrors/so/SopCastComponent SopCastComponent是一个强大的Android直播开发框架&am…...

iOS YYKline核心组件解析:Model、Painter与Config架构设计

iOS YYKline核心组件解析:Model、Painter与Config架构设计 【免费下载链接】YYKline iOS YYKline:Kline、Chart、Volume、Scroll、Scale、MACD、KDJ、K线图、分时图... 项目地址: https://gitcode.com/gh_mirrors/yy/YYKline iOS YYKline是一个功…...