1
2
3
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