Back to Lo

Simd Meanby

docs/data/simd-meanby.md

1.53.01.6 KB
Original Source

MeanBy transforms a collection using an iteratee function and calculates the arithmetic mean of the result using SIMD instructions. The automatic dispatch functions (e.g., MeanByInt8) will select the best SIMD variant based on CPU capabilities. The specific variants (e.g., MeanByInt8x32) use a fixed SIMD instruction set regardless of CPU capabilities.

Note: The automatic dispatch functions (e.g., MeanByInt8) will use the best available SIMD variant for the current CPU. Use specific variants (e.g., MeanByInt8x32) only if you know your target CPU supports that instruction set.

go
type Person struct {
    Name string
    Age  int8
}

people := []Person{
    {Name: "Alice", Age: 20},
    {Name: "Bob", Age: 30},
    {Name: "Charlie", Age: 40},
}

// Automatic dispatch - uses best available SIMD
mean := simd.MeanByInt8(people, func(p Person) int8 {
    return p.Age
})
// 30
go
type Product struct {
    Name  string
    Price float32
}

products := []Product{
    {Name: "Widget", Price: 10.50},
    {Name: "Gadget", Price: 20.00},
    {Name: "Tool", Price: 15.75},
}

// Mean price using specific AVX2 variant
mean := simd.MeanByFloat32x8(products, func(p Product) float32 {
    return p.Price
})
// 15.4167
go
type Metric struct {
    Value uint16
}

metrics := []Metric{
    {Value: 100},
    {Value: 200},
    {Value: 300},
    {Value: 400},
}

// Using AVX variant - works on all amd64
mean := simd.MeanByUint16x8(metrics, func(m Metric) uint16 {
    return m.Value
})
// 250
go
// Empty collection returns 0
type Item struct {
    Count int64
}

mean := simd.MeanByInt64([]Item{}, func(i Item) int64 {
    return i.Count
})
// 0