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  }