Skip to content

Instantly share code, notes, and snippets.

@apense
Created June 10, 2015 21:28
Show Gist options
  • Save apense/2cb1ec9779bc535611e8 to your computer and use it in GitHub Desktop.
Save apense/2cb1ec9779bc535611e8 to your computer and use it in GitHub Desktop.
Bit manipulation with SSE4
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