![]() |
1
2
也许我疯了,但我玩得很开心:D 该解决方案基于数据并行性的使用,并在不实际使用SSE内部函数或任何类似方法的情况下伪造矢量cpu。
通过重新排序计算,我们可以进一步显著减少执行时间,因为它大大减少了将某些内容加载到QWORD中的次数。其他一些优化非常明显,而且相当小,但总结起来是另一个有趣的加速。
在我的电脑上编译为64位二进制文件的本机c++中5000万次执行的运行时间(所有输出都经过验证以匹配^^):
|
![]() |
2
1
我现在不想编码的一个建议是使用循环、数组来保存部分结果,以及常量来一次提取位m。
这将在每个求和中选取太多的位。但你也可以跟踪中间结果,并在计算过程中从总和中减去,以解释可能不再存在的比特。
当然,通过适当的边界检查。 最快的方法是直接对总和进行硬编码。
等等(转换发生在编译时。) |
![]() |
no one special · 32位整数缩放,无溢出 7 年前 |
![]() |
Benn Tan · 比特操作:更难翻动硬币 7 年前 |
![]() |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 7 年前 |
![]() |
datapanda · 三维网格的莫顿反向编码 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
|
John Proctor · C中位的掩蔽范围 7 年前 |
![]() |
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
user9505617 · 按位异或0xFFFFFFFF? 7 年前 |