diff --git a/internal/fastops/detect.go b/internal/fastops/detect.go index 02a85854..adf1ef28 100644 --- a/internal/fastops/detect.go +++ b/internal/fastops/detect.go @@ -66,8 +66,10 @@ func NewDispatcher() *Dispatcher { } // EntropyFilter dispatches to scalar implementation (float64 SIMD deferred). -// TODO: implement entropyAVX2 — with VFMADD231PD + assembly in entropy_amd64.s -// TODO: implement entropyNEON — with FMLA + assembly in entropy_arm64.s +// SIMD implementations are platform-specific and deferred: +// - AVX2 (amd64): requires VFMADD231PD assembly in entropy_amd64.s +// - NEON (arm64): requires FMLA assembly in entropy_arm64.s +// Current scalar implementation provides baseline performance. func (d *Dispatcher) EntropyFilter(data []float64) float64 { return entropyScalar(data) } diff --git a/internal/fastops/entropy_bench_test.go b/internal/fastops/entropy_bench_test.go new file mode 100644 index 00000000..409c0552 --- /dev/null +++ b/internal/fastops/entropy_bench_test.go @@ -0,0 +1,37 @@ +package fastops + +import ( + "math/rand" + "testing" +) + +func BenchmarkEntropyFilter(b *testing.B) { + sizes := []int{256, 1024, 4096, 16384} + d := NewDispatcher() + + for _, size := range sizes { + data := make([]float64, size) + for i := range data { + data[i] = rand.Float64() + } + + b.Run(benchName(size), func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = d.EntropyFilter(data) + } + }) + } +} + +func benchName(size int) string { + switch { + case size < 1024: + return "256B" + case size < 4096: + return "1KB" + case size < 16384: + return "4KB" + default: + return "16KB" + } +}