github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/bench_arm64_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 benchmarkDotGo(b *testing.B, dims int) {
    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  		DotProductGo(vec1, vec2)
    34  	}
    35  }
    36  
    37  func benchmarkDotNeon(b *testing.B, dims int) {
    38  	r := getRandomSeed()
    39  
    40  	vec1 := make([]float32, dims)
    41  	vec2 := make([]float32, dims)
    42  	for i := range vec1 {
    43  		vec1[i] = r.Float32()
    44  		vec2[i] = r.Float32()
    45  	}
    46  
    47  	b.ResetTimer()
    48  	for n := 0; n < b.N; n++ {
    49  		asm.Dot(vec1, vec2)
    50  	}
    51  }
    52  
    53  func BenchmarkDot(b *testing.B) {
    54  	dims := []int{30, 32, 128, 256, 300, 384, 600, 768, 1024}
    55  	for _, dim := range dims {
    56  		b.Run(fmt.Sprintf("%d dimensions", dim), func(b *testing.B) {
    57  			b.Run("pure go", func(b *testing.B) { benchmarkDotGo(b, dim) })
    58  			b.Run("avx", func(b *testing.B) { benchmarkDotNeon(b, dim) })
    59  		})
    60  	}
    61  }