Source file src/simd/testdata/ip/main.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"simd"
    10  )
    11  
    12  var sumWidth int
    13  var emulated bool
    14  
    15  func main() {
    16  	var a, b [50]float32
    17  	for i := 0; i < 50; i++ {
    18  		a[i] = float32(i)
    19  		b[i] = float32(i)
    20  	}
    21  	fmt.Println(ip(a[:5], b[:5]))
    22  	fmt.Println(ip(a[:10], b[:10]))
    23  	fmt.Println(ip(a[:20], b[:20]))
    24  	fmt.Println(ip(a[:30], b[:30]))
    25  	fmt.Println(ip(a[:40], b[:40]))
    26  	fmt.Println(ip(a[:50], b[:50]))
    27  
    28  	fmt.Printf("sum was computed in width %d, emulated = %v\n", sumWidth, emulated)
    29  }
    30  
    31  func first[T, U any](t T, u U) T {
    32  	return t
    33  }
    34  
    35  func ip(x, y []float32) float32 {
    36  	var a simd.Float32s
    37  	sumWidth = a.Len() * 32
    38  	emulated = simd.Emulated()
    39  	var i int
    40  	for i = 0; i < len(x)-a.Len()+1; i += a.Len() {
    41  		u := simd.LoadFloat32s(x[i : i+a.Len()])
    42  		v := simd.LoadFloat32s(y[i : i+a.Len()])
    43  		a = a.Add(u.Mul(v))
    44  	}
    45  	if i < len(x) {
    46  		a = a.Add(first(simd.LoadFloat32sPart(x[i:])).
    47  			Mul(first(simd.LoadFloat32sPart(y[i:]))))
    48  	}
    49  
    50  	return sum(a)
    51  }
    52  

View as plain text