繁体   English   中英

将32位整数映射到32个bin中,每个bin中有1,2,4..2 ^ 31个连续整数

[英]Map the 32bit integers into 32 bins, with 1,2,4..2^31 consecutive integers per bin

对于32位整数,请将其划分为32个连续整数的仓,这样每个连续仓中的整数就是两倍。 第一个容器包含0,第二个容器包含0..1,依此类推,直到0..2 ^ 31-1。

给定一个32位整数i,在i7上,我能想到的最快算法是5个周期(位扫描是3个周期):

// bin is the number of leading zeroes, and then we clear the msb to get item
bin_index = bsr(i)
item = i ^ (1 << bin_index)

或等效地(将项目0..2 ^(32-1)存储在bin 0中,将0存储在bin 31中,但这没关系):

// bin is the number of trailing zeroes, and then we shift down by that many bits + 1
bin_index = bsf(i)
item = i >> (bin_index + 1)

在每种情况下,bin索引都被编码为前导/尾随零位的数目,并用1将它们与项目号分开。 您可以对前导或尾随的通配符和零进行分隔以进行相同的操作。 两者都不适用于i = 0,但这并不重要。

整数与bin / items之间的映射可以是完全任意的,只要在每个连续的bin中以两倍多的连续整数结尾,并且bin中的整数总数为2 ^ 32-1。 您能想到一种在i7上对32个整数进行装箱的更有效的算法吗? 请记住,i7是超标量的,因此任何不依赖于彼此的操作都可以并行执行,直到每种指令类型的吞吐量都可以达到。

您可以通过在对零进行计数之前先对数据进行排序来改善算法。

例如,首先将其与2 ^ 31进行比较,如果比较大则将其放入该bin中,否则继续计算尾随零。 这样,您现在可以通过2条指令将数据集的一半放入其容器中……大概两个周期。 另一半将花费更长的时间,但最终结果将是改善。 如果有想法,您可能甚至可以进一步优化此行。

我想这也将取决于分支预测的效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM