Created
June 10, 2015 21:28
-
-
Save apense/2cb1ec9779bc535611e8 to your computer and use it in GitHub Desktop.
Bit manipulation with SSE4
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import benchmark as bm | |
proc popcnt(i: int): int = | |
# this doesn't check if the instruction exists! | |
asm """ | |
popcnt %%rbx, %%rax | |
:"=a"(`result`) | |
:"b"(`i`) | |
""" | |
from math import countbits32 | |
bm.suite "factorial", 3.0: | |
var | |
ts: TestStats | |
tsArray: array[0..8, TestStats] | |
loops = 0 | |
test "cb", 3.5, tsArray: | |
for i in 0..<(1 shl 7): | |
discard countbits32(i.int32) | |
test "cb2", 3.5, tsArray: | |
for i in 0..<(1 shl 7): | |
discard popcnt(i) | |
# speedup is about 0.5us minimum, 0.95us average | |
# factorial.cb: ts[0]={min=3.540us mean=4.146us minC=1 n=80985} | |
# factorial.cb: ts[1]={min=3.544us mean=4.150us minC=1 n=80985} | |
# factorial.cb: ts[2]={min=3.544us mean=4.151us minC=12 n=80985} | |
# factorial.cb: ts[3]={min=3.544us mean=4.153us minC=10 n=80985} | |
# factorial.cb: ts[4]={min=3.544us mean=4.154us minC=4 n=80985} | |
# factorial.cb: ts[5]={min=3.545us mean=4.157us minC=3 n=80985} | |
# factorial.cb: ts[6]={min=3.554us mean=4.174us minC=1 n=80985} | |
# factorial.cb: ts[7]={min=3.554us mean=4.243us minC=1 n=80985} | |
# factorial.cb: ts[8]={min=3.554us mean=4.983us minC=1 n=80985} | |
# factorial.cb2: ts[0]={min=2.975us mean=3.206us minC=2 n=99406} | |
# factorial.cb2: ts[1]={min=3.035us mean=3.210us minC=1 n=99406} | |
# factorial.cb2: ts[2]={min=3.039us mean=3.213us minC=1 n=99406} | |
# factorial.cb2: ts[3]={min=3.043us mean=3.216us minC=112 n=99406} | |
# factorial.cb2: ts[4]={min=3.044us mean=3.219us minC=43230 n=99406} | |
# factorial.cb2: ts[5]={min=3.044us mean=3.224us minC=42945 n=99406} | |
# factorial.cb2: ts[6]={min=3.044us mean=3.240us minC=42451 n=99406} | |
# factorial.cb2: ts[7]={min=3.044us mean=3.315us minC=41497 n=99406} | |
# factorial.cb2: ts[8]={min=3.044us mean=4.048us minC=40301 n=99406} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment