For example, trading more memory in less processor time,
package main
import (
"fmt"
"unsafe"
)
func Float32Align32(n int) []float32 {
const align = 32
const size = unsafe.Sizeof(float32(0))
const pad = int(align/size - 1)
if n <= 0 {
return nil
}
s := make([]float32, n+pad)
p := uintptr(unsafe.Pointer(&s[0]))
i := int(((p+align-1)/align*align - p) / size)
j := i + n
return s[i:j:j]
}
func main() {
f := Float32Align32(8)
fmt.Printf(
"SIMD AVX: %T %d %d %p %g\n",
f, len(f), cap(f), &f[0], f,
)
CFuncArg := &f[0]
fmt.Println("CFuncArg:", CFuncArg)
}
Playground: https://play.golang.org/p/mmFnHEwGKt
Conclusion:
SIMD AVX: []float32 8 8 0x10436080 [0 0 0 0 0 0 0 0]
CFuncArg: 0x10436080
source
share