github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/asm/dot_inline.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 // Experiment with inlining and flattening the L2Squared distancer. 15 // Theoretically, this should be faster than the loop version for small vectors 16 // - it avoids the loop overhead 17 // - it eliminates the bounds check by reversing the iteration 18 // - it allows dot2, dot4 and dot6 to be inlined (the other ones are too large) 19 // See go tool compile -d=ssa/check_bce/debug=1 -m dot_inline.go 20 21 func dot2(x []float32, y []float32) float32 { 22 sum := x[1]*y[1] + x[0]*y[0] 23 24 return sum 25 } 26 27 func dot4(x []float32, y []float32) float32 { 28 sum := x[3]*y[3] + x[2]*y[2] 29 30 return dot2(x, y) + sum 31 } 32 33 func dot6(x []float32, y []float32) float32 { 34 sum := x[5]*y[5] + x[4]*y[4] 35 36 return dot4(x, y) + sum 37 } 38 39 func dot8(x []float32, y []float32) float32 { 40 sum := x[7]*y[7] + x[6]*y[6] 41 42 return dot6(x, y) + sum 43 } 44 45 func dot10(x []float32, y []float32) float32 { 46 sum := x[9]*y[9] + x[8]*y[8] + x[7]*y[7] + x[6]*y[6] 47 48 return dot6(x, y) + sum 49 } 50 51 func dot12(x []float32, y []float32) float32 { 52 sum := x[11]*y[11] + x[10]*y[10] + x[9]*y[9] + x[8]*y[8] + x[7]*y[7] + x[6]*y[6] 53 54 return dot6(x, y) + sum 55 }