POPCNT如何在硬件中实现?

     2023-03-17     55

关键词:

【中文标题】POPCNT如何在硬件中实现?【英文标题】:How is POPCNT implemented in hardware? 【发布时间】:2015-05-02 09:15:37 【问题描述】:

根据http://www.agner.org/optimize/instruction_tables.pdf,POPCNT 指令(返回 32 位或 64 位寄存器中设置的位数)在现代 Intel 和 AMD 处理器上每个时钟周期的吞吐量为 1 条指令。这比任何需要多条指令的软件实现都要快得多 (How to count the number of set bits in a 32-bit integer?)。

POPCNT 是如何在硬件中如此高效地实现的?

【问题讨论】:

此操作也称为汉明权重。这可能对您的研究有所帮助。例如,请参阅Digital Hamming Weight and Distance Analyzers for Binary Vectors and Matrices (Sklyarov 2012)。 如果某些东西是在硬件中实现的(不是微码),它应该很快。无论如何,如果你有足够的内存和缓存,你可以很容易地在软件中实现高速弹出计数,使用查找表 【参考方案1】:

有一项组合popcnt,位扫描正向/反向的专利:

US8214414 B2 - Combined set bit count and detector logic

摘要

描述了 PopCount 和 BitScan 的合并数据路径。硬件电路包括用于 PopCount 函数的压缩器树,它被 BitScan 函数重用(例如,位扫描正向 (BSF) 或位扫描反向 (BSR))。选择器逻辑使压缩器树能够根据微处理器指令对 PopCount 或 BitScan 操作的输入字进行操作。如果选择了 BitScan 操作,则对输入字进行编码。压缩树接收输入字,对位进行操作,就好像所有位都具有相同的重要性级别(例如,对于 N 位输入字,输入字被视为 N 个一位输入)。压缩树电路的结果是一个二进制值,表示与执行的操作相关的数字(PopCount 的设置位数,或扫描输入字时遇到的第一个设置位的位位置)。

【讨论】:

虽然我不喜欢仅链接的答案,但这是一个非常酷的链接。 那么 9 张原理图图像很难作为答案发布。既然是专利,一切都解释清楚了。 哇,这就解释了为什么popcnt 对英特尔 SnB 系列的输出寄存器存在错误的依赖关系。我认为它只是在同一类 uops 中,并不是说它真的在与 bsr/bsf 相同的执行单元的同一路径上运行(需要将目标作为输入,以便他们可以保持不变) src=0 case.) 有趣的事实:英特尔修复了 Skylake 中 tzcnt/lzcnt 的错误 dep,但未修复 popcnt 相关:Why does breaking the "output dependency" of LZCNT matter?

OpenCL中的popcnt?

】OpenCL中的popcnt?【英文标题】:popcntinOpenCL?【发布时间】:2011-05-0622:49:28【问题描述】:较新的NVIDIAGPU支持__popc(x)指令,该指令计算32位寄存器中设置的位数。我是99%OpenCL不支持内联汇编器,除非它是供应商内核扩展。1)AMD硬... 查看详情

如何在 laravel 中实现 vuetify?

】如何在laravel中实现vuetify?【英文标题】:Howtoimplementvuetifyinlaravel?【发布时间】:2018-07-2123:32:58【问题描述】:我是vuetify的新手,我试图在laravel中实现它。有人已经在laravel中实现了vuetify,可以告诉我怎么做吗?我已经安装... 查看详情

如何在android中实现BottomAppBar?

】如何在android中实现BottomAppBar?【英文标题】:howtoimplementBottomAppBarinandroid?【发布时间】:2020-12-2823:06:46【问题描述】:如何在android中实现BottomAppBar。build.gradleimplementation\'com.google.android.material:material:1.0.0-beta01\'activity_main 查看详情

如何在android中实现svm模型?

】如何在android中实现svm模型?【英文标题】:Howtoimplementsvmmodelinandroid?【发布时间】:2014-05-3121:47:13【问题描述】:我在Matlab中使用svmtrain训练了分类器,现在我不知道如何在android中实现模型。甚至没有一个例子来展示如何使用... 查看详情

如何在 Gson 中实现 TypeAdapterFactory?

】如何在Gson中实现TypeAdapterFactory?【英文标题】:HowdoIimplementTypeAdapterFactoryinGson?【发布时间】:2014-04-1323:34:16【问题描述】:如何在Gson中实现TypeAdapterFactory类型?create的主要方法是泛型的。为什么?注册方法registerTypeAdapterFacto... 查看详情

如何在 Fragments 中实现 onBackPressed()?

】如何在Fragments中实现onBackPressed()?【英文标题】:HowtoimplementonBackPressed()inFragments?【发布时间】:2011-07-2320:22:18【问题描述】:有没有一种方法可以在AndroidFragment中实现onBackPressed(),类似于我们在AndroidActivity中的实现方式?由... 查看详情

如何在 exoplayer 中实现 OkHttpDataSourceFactory?

】如何在exoplayer中实现OkHttpDataSourceFactory?【英文标题】:HowdoyouimplementOkHttpDataSourceFactoryinexoplayer?【发布时间】:2020-12-0714:51:40【问题描述】:在exoplayer中如何实现OkHttpDataSourceFactory?【问题讨论】:【参考方案1】:我翻遍了,... 查看详情

如何在 Swift 中实现 NSWindowRestoration?

】如何在Swift中实现NSWindowRestoration?【英文标题】:HowtoimplementNSWindowRestorationinSwift?【发布时间】:2014-06-1000:50:12【问题描述】:我尝试在非基于文档的应用程序中在Swift中实现NSWindowRestoration协议。然而,restoreWindowWithIdentifier方... 查看详情

如何在 Scala 中实现 DAO?

】如何在Scala中实现DAO?【英文标题】:HowtoimplementDAOinScala?【发布时间】:2011-07-1819:24:50【问题描述】:我想在Scala中实现DAO,如下所示:traitDAO[PK,-T,-Q]//Tisa"valueobject",PKisaprimarykey,andQisqueryparameters.defcreate(t:T):Unitdefupdate(t:T):Unitdefr... 查看详情

如何在 Swift 中实现单例类

】如何在Swift中实现单例类【英文标题】:HowtoImplementSingletonclassinSwift[duplicate]【发布时间】:2016-02-1822:01:56【问题描述】:我是swift编程新手,请告诉我如何使用代码在swift中实现单例类。在obj-c中我知道+(id)sharedManagerstaticMediaMode... 查看详情

如何在 JavaScript 中实现锁

】如何在JavaScript中实现锁【英文标题】:HowtoimplementalockinJavaScript【发布时间】:2011-07-1719:55:47【问题描述】:如何在JavaScript中实现与C#中的lock等效的东西?所以,为了解释我的想法,一个简单的用例是:用户点击按钮B。B引发o... 查看详情

如何在矢量中实现按钮

】如何在矢量中实现按钮【英文标题】:Howtoimplementbuttoninavector【发布时间】:2012-12-0915:42:18【问题描述】:在我的桌子上。我想在我可以按下的每一行中放置一些按钮。但我不知道该怎么做publicstaticDefaultTableModelbuildTableModel(Resu... 查看详情

如何在颤动中实现这种效果/布局?

】如何在颤动中实现这种效果/布局?【英文标题】:Howtoachievethiseffect/layoutinflutter?【发布时间】:2021-10-0520:29:18【问题描述】:我发现,这种搜索效果是内置在ios框架中的。但是这种布局如何在Flutter中实现呢?【问题讨论】:... 查看详情

这是如何在 swift 4 中实现的?

】这是如何在swift4中实现的?【英文标题】:Howisthisimplementedinswift4?【发布时间】:2018-08-0413:25:33【问题描述】:我有这个link用于表格视图中的下拉搜索栏。我能够使用此代码在tableview中实现搜索栏searchController.searchResultsUpdater=s... 查看详情

如何在 RecyclerView 中实现 StartActivityForResult

】如何在RecyclerView中实现StartActivityForResult【英文标题】:HowtoimplementStartActivityForResultinRecyclerView【发布时间】:2018-07-1916:07:21【问题描述】:我正在尝试在我的RecyclerView中使用startActivityForResult并且不知道如何...尝试了这种方式... 查看详情

如何在 Chrome 中实现抓取光标图标?

】如何在Chrome中实现抓取光标图标?【英文标题】:HowcanyouimplementagrabbingcursoriconinChrome?【发布时间】:2011-04-0715:32:01【问题描述】:我知道可以在Chrome中使用抓取光标图标(当然是在Gmail中),但我不知道如何在我的代码中实现... 查看详情

如何在电子中实现延迟深度链接

】如何在电子中实现延迟深度链接【英文标题】:howtoimplementimplementdeferreddeeplinkinginelectron【发布时间】:2021-01-2623:54:16【问题描述】:试图找到有关如何在电子应用程序中实现延迟深度链接的信息,但在官方电子文档中找不到... 查看详情

如何在 Xamarin 中实现 SfMap

】如何在Xamarin中实现SfMap【英文标题】:HowcanIimplementSfMapinXamarin【发布时间】:2021-10-2514:22:03【问题描述】:如何在基于MVVM结构的项目中实现SfMaps?第一,我必须获取我当前的位置并将其显示在地图上,然后我必须将该标记点... 查看详情