github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/bench_amd64_test.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package distancer 13 14 import ( 15 "fmt" 16 "testing" 17 18 "github.com/weaviate/weaviate/adapters/repos/db/vector/hnsw/distancer/asm" 19 ) 20 21 func benchmarkDot(b *testing.B, dims int, dotFn func(a, b []float32) float32) { 22 r := getRandomSeed() 23 24 vec1 := make([]float32, dims) 25 vec2 := make([]float32, dims) 26 for i := range vec1 { 27 vec1[i] = r.Float32() 28 vec2[i] = r.Float32() 29 } 30 31 b.ResetTimer() 32 for n := 0; n < b.N; n++ { 33 dotFn(vec1, vec2) 34 } 35 } 36 37 func BenchmarkDot(b *testing.B) { 38 dims := []int{2, 4, 6, 8, 10, 12, 16, 24, 30, 32, 128, 256, 300, 384, 512, 768, 1024, 1536} 39 for _, dim := range dims { 40 b.Run(fmt.Sprintf("%d dimensions", dim), func(b *testing.B) { 41 b.Run("pure go", func(b *testing.B) { benchmarkDot(b, dim, DotProductGo) }) 42 b.Run("avx", func(b *testing.B) { benchmarkDot(b, dim, asm.Dot) }) 43 b.Run("avx512", func(b *testing.B) { benchmarkDot(b, dim, asm.DotAVX512) }) 44 }) 45 } 46 }