我正在寻找最快的方法,以在512个或更多字节的大型缓冲区上弹出。我可以保证任何必需的对齐,并且缓冲区大小始终是2的功率。缓冲区对应于块分配,因此,通常所有设置,无设置,或者主要设置了偏爱缓冲区的“左”,带有偶尔的孔。

我考虑过的一些解决方案是:

我对最快的解决方案感兴趣,它必须在属于Core2或更新的32位X86芯片组上工作。 SSE和SIMD引起了极大的兴趣。我将在以下Quad Core CPU上进行测试:

matt@stanley:~/anacrolix/public/stackoverflow$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 1600.000
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority
bogomips        : 4800.21
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:
有帮助吗?

解决方案 3

我概述了我发现的最好的C/组件功能 人口计数/锤击 下面的大型缓冲区。

最快的组装功能是 ssse3_popcount3, , 描述 这里. 。这个需要 SSSE3, ,可在Intel Core 2和更高版本上获得,以及2011年到达的AMD芯片组。它使用 simd 一次在16个字节块和展开中爆炸的说明一次4循环迭代。

最快的C函数是 popcount_24words, , 描述 这里. 。它使用位算法。值得注意的是,我发现 实际上可以生成适当的矢量组装说明,从而增加了令人印象深刻的性能。除此之外,该算法仍然非常快。

其他提示

AMD软件优化指南, ,第195页用于一个实施。这为您提供了X86的汇编代码。

看到一个变体 斯坦福大学咬伤黑客斯坦福版本对我来说是最好的版本。将代码为X86 ASM看起来很容易。

这些都没有使用分支说明。

这些可以推广到64位版本。

使用32或64位版本,您可以考虑执行SIMD版本。 SSE2将同时执行4个双词或两个四词(无论哪种方式128位)。您要做的是在可用的2或4个寄存器中的每个寄存器中实现32或64位的爆米花。完成后,您最终会在XMM寄存器中获得2或4套爆米花;最后一步是将这些爆炸板存储并添加在一起以获取最终答案。猜测,我希望您做4平行32位爆炸案,而不是2平行64位爆炸案,因为后者很可能在每次迭代中采用1或2个其他说明,并且易于添加4、32位末端的值在一起。

我建议从 黑客的喜悦, ,但要在SSE向量中使用4 x 32位整数元素。然后,您可以通过迭代处理128位,与优化的32位标量例程相比,这应该给您4倍的吞吐量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top