github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/asm/l2_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 l22 and l24 to be inlined (the other ones are too large) 19 // See go tool compile -d=ssa/check_bce/debug=1 -m l2_inline.go 20 21 func l22(x []float32, y []float32) float32 { 22 diff := x[1] - y[1] 23 sum := diff * diff 24 25 diff = x[0] - y[0] 26 sum += diff * diff 27 28 return sum 29 } 30 31 func l24(x []float32, y []float32) float32 { 32 diff := x[3] - y[3] 33 sum := diff * diff 34 35 diff = x[2] - y[2] 36 sum += diff * diff 37 38 return l22(x, y) + sum 39 } 40 41 func l26(x []float32, y []float32) float32 { 42 diff := x[5] - y[5] 43 sum := diff * diff 44 45 diff = x[4] - y[4] 46 sum += diff * diff 47 48 return l24(x, y) + sum 49 } 50 51 func l28(x []float32, y []float32) float32 { 52 diff := x[7] - y[7] 53 sum := diff * diff 54 55 diff = x[6] - y[6] 56 sum += diff * diff 57 58 diff = x[5] - y[5] 59 sum += diff * diff 60 61 diff = x[4] - y[4] 62 sum += diff * diff 63 64 return l24(x, y) + sum 65 } 66 67 func l210(x []float32, y []float32) float32 { 68 diff := x[9] - y[9] 69 sum := diff * diff 70 71 diff = x[8] - y[8] 72 sum += diff * diff 73 74 diff = x[7] - y[7] 75 sum += diff * diff 76 77 diff = x[6] - y[6] 78 sum += diff * diff 79 80 diff = x[5] - y[5] 81 sum += diff * diff 82 83 diff = x[4] - y[4] 84 sum += diff * diff 85 86 return l24(x, y) + sum 87 } 88 89 func l212(x []float32, y []float32) float32 { 90 diff := x[11] - y[11] 91 sum := diff * diff 92 93 diff = x[10] - y[10] 94 sum += diff * diff 95 96 diff = x[9] - y[9] 97 sum += diff * diff 98 99 diff = x[8] - y[8] 100 sum += diff * diff 101 102 diff = x[7] - y[7] 103 sum += diff * diff 104 105 diff = x[6] - y[6] 106 sum += diff * diff 107 108 diff = x[5] - y[5] 109 sum += diff * diff 110 111 diff = x[4] - y[4] 112 sum += diff * diff 113 114 return l24(x, y) + sum 115 }