[Pkg-privacy-commits] [golang-siphash-dev] 10/23: Unroll loops in Hash().

Ximin Luo infinity0 at moszumanska.debian.org
Sat Aug 22 12:55:53 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository golang-siphash-dev.

commit d3a11640a6a090ba03459656bba9982b58754c2d
Author: Dmitry Chestnykh <dmitry at codingrobots.com>
Date:   Thu Jun 21 15:53:36 2012 +0200

    Unroll loops in Hash().
    
    On 64-bit Atom netbook:
    
    benchmark           old ns/op    new ns/op    delta
    BenchmarkHash8            151          137   -9.27%
    BenchmarkHash16           237          207  -12.66%
    BenchmarkHash40           449          414   -7.80%
    BenchmarkHash64           665          624   -6.17%
    BenchmarkHash128         1239         1145   -7.59%
    BenchmarkHash1K          9179         8578   -6.55%
    BenchmarkHash8K         73941        68089   -7.91%
    
    benchmark            old MB/s     new MB/s  speedup
    BenchmarkHash8          52.79        58.14    1.10x
    BenchmarkHash16         67.25        77.02    1.15x
    BenchmarkHash40         88.92        96.39    1.08x
    BenchmarkHash64         96.11       102.55    1.07x
    BenchmarkHash128       103.30       111.79    1.08x
    BenchmarkHash1K        111.56       119.37    1.07x
    BenchmarkHash8K        110.79       120.31    1.09x
---
 hash.go | 199 +++++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 148 insertions(+), 51 deletions(-)

diff --git a/hash.go b/hash.go
index 86e4912..e7e12ee 100644
--- a/hash.go
+++ b/hash.go
@@ -15,25 +15,45 @@ func Hash(k0, k1 uint64, p []byte) uint64 {
 		m := uint64(p[0]) | uint64(p[1])<<8 | uint64(p[2])<<16 | uint64(p[3])<<24 |
 			uint64(p[4])<<32 | uint64(p[5])<<40 | uint64(p[6])<<48 | uint64(p[7])<<56
 		v3 ^= m
-		for i := 0; i < CRounds; i++ {
-			v0 += v1
-			v1 = v1<<13 | v1>>(64-13)
-			v1 ^= v0
-			v0 = v0<<32 | v0>>(64-32)
-
-			v2 += v3
-			v3 = v3<<16 | v3>>(64-16)
-			v3 ^= v2
-
-			v0 += v3
-			v3 = v3<<21 | v3>>(64-21)
-			v3 ^= v0
-
-			v2 += v1
-			v1 = v1<<17 | v1>>(64-17)
-			v1 ^= v2
-			v2 = v2<<32 | v2>>(64-32)
-		}
+
+		// Round 1.
+		v0 += v1
+		v1 = v1<<13 | v1>>(64-13)
+		v1 ^= v0
+		v0 = v0<<32 | v0>>(64-32)
+
+		v2 += v3
+		v3 = v3<<16 | v3>>(64-16)
+		v3 ^= v2
+
+		v0 += v3
+		v3 = v3<<21 | v3>>(64-21)
+		v3 ^= v0
+
+		v2 += v1
+		v1 = v1<<17 | v1>>(64-17)
+		v1 ^= v2
+		v2 = v2<<32 | v2>>(64-32)
+
+		// Round 2.
+		v0 += v1
+		v1 = v1<<13 | v1>>(64-13)
+		v1 ^= v0
+		v0 = v0<<32 | v0>>(64-32)
+
+		v2 += v3
+		v3 = v3<<16 | v3>>(64-16)
+		v3 ^= v2
+
+		v0 += v3
+		v3 = v3<<21 | v3>>(64-21)
+		v3 ^= v0
+
+		v2 += v1
+		v1 = v1<<17 | v1>>(64-17)
+		v1 ^= v2
+		v2 = v2<<32 | v2>>(64-32)
+
 		v0 ^= m
 		p = p[BlockSize:]
 	}
@@ -62,47 +82,124 @@ func Hash(k0, k1 uint64, p []byte) uint64 {
 		t |= uint64(p[0])
 	}
 	v3 ^= t
-	for i := 0; i < CRounds; i++ {
-		v0 += v1
-		v1 = v1<<13 | v1>>(64-13)
-		v1 ^= v0
-		v0 = v0<<32 | v0>>(64-32)
 
-		v2 += v3
-		v3 = v3<<16 | v3>>(64-16)
-		v3 ^= v2
+	// Round 1.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
 
-		v0 += v3
-		v3 = v3<<21 | v3>>(64-21)
-		v3 ^= v0
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
 
-		v2 += v1
-		v1 = v1<<17 | v1>>(64-17)
-		v1 ^= v2
-		v2 = v2<<32 | v2>>(64-32)
-	}
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
+
+	// Round 2.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
+
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
+
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
 	v0 ^= t
 
 	// Finalization.
 	v2 ^= 0xff
-	for i := 0; i < DRounds; i++ {
-		v0 += v1
-		v1 = v1<<13 | v1>>(64-13)
-		v1 ^= v0
-		v0 = v0<<32 | v0>>(64-32)
 
-		v2 += v3
-		v3 = v3<<16 | v3>>(64-16)
-		v3 ^= v2
+	// Round 1.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
 
-		v0 += v3
-		v3 = v3<<21 | v3>>(64-21)
-		v3 ^= v0
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
+
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
+
+	// Round 2.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
+
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
+
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
+
+	// Round 3.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
+
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
+
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
+
+	// Round 4.
+	v0 += v1
+	v1 = v1<<13 | v1>>(64-13)
+	v1 ^= v0
+	v0 = v0<<32 | v0>>(64-32)
+
+	v2 += v3
+	v3 = v3<<16 | v3>>(64-16)
+	v3 ^= v2
+
+	v0 += v3
+	v3 = v3<<21 | v3>>(64-21)
+	v3 ^= v0
+
+	v2 += v1
+	v1 = v1<<17 | v1>>(64-17)
+	v1 ^= v2
+	v2 = v2<<32 | v2>>(64-32)
 
-		v2 += v1
-		v1 = v1<<17 | v1>>(64-17)
-		v1 ^= v2
-		v2 = v2<<32 | v2>>(64-32)
-	}
 	return v0 ^ v1 ^ v2 ^ v3
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/golang-siphash-dev.git



More information about the Pkg-privacy-commits mailing list