github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/asm/dot_inline_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 asm
    13  
    14  import (
    15  	"fmt"
    16  	"math/rand"
    17  	"testing"
    18  )
    19  
    20  func dotLoop(x, y []float32) float32 {
    21  	var sum float32
    22  	for i := range x {
    23  		sum += x[i] * y[i]
    24  	}
    25  
    26  	return sum
    27  }
    28  
    29  func BenchmarkDotInlineVsLoop(b *testing.B) {
    30  	lengths := []int{2, 4, 6, 8, 10, 12}
    31  	for _, length := range lengths {
    32  		x := make([]float32, length)
    33  		y := make([]float32, length)
    34  
    35  		for i := range x {
    36  			x[i] = rand.Float32()
    37  			y[i] = rand.Float32()
    38  		}
    39  
    40  		b.Run(fmt.Sprintf("vector dim=%d", length), func(b *testing.B) {
    41  			b.Run("loop", func(b *testing.B) {
    42  				for i := 0; i < b.N; i++ {
    43  					dotLoop(x, y)
    44  				}
    45  			})
    46  
    47  			b.Run("flat", func(b *testing.B) {
    48  				// written to ensure that the compiler
    49  				// inlines the function when possible
    50  				switch length {
    51  				case 2:
    52  					b.ResetTimer()
    53  					for i := 0; i < b.N; i++ {
    54  						dot2(x, y)
    55  					}
    56  				case 4:
    57  					b.ResetTimer()
    58  					for i := 0; i < b.N; i++ {
    59  						dot4(x, y)
    60  					}
    61  				case 6:
    62  					b.ResetTimer()
    63  					for i := 0; i < b.N; i++ {
    64  						dot6(x, y)
    65  					}
    66  				case 8:
    67  					b.ResetTimer()
    68  					for i := 0; i < b.N; i++ {
    69  						dot8(x, y)
    70  					}
    71  				case 10:
    72  					b.ResetTimer()
    73  					for i := 0; i < b.N; i++ {
    74  						dot10(x, y)
    75  					}
    76  				case 12:
    77  					b.ResetTimer()
    78  					for i := 0; i < b.N; i++ {
    79  						dot12(x, y)
    80  					}
    81  				default:
    82  					panic("unsupported length")
    83  				}
    84  			})
    85  		})
    86  	}
    87  }