Go 1.27 SIMD: теперь уже настоящий benchmark
В прошлый раз я просто включил: cmd set GOEXPERIMENT=simd Но это само по себе ничего не ускоряет. Обычный Go-код от этого не начинает автоматически использовать SIMD. Теперь переписал ту же самую операцию уже с использованием simd. Задача всё та же: 10 млн float32 → найти значения больше 100 Обычный вариант: go func filterRegular(values []float32, threshold float32, result []float32) { for i, v := range values { if v > threshold { result[i] = 1 } else { result[i] = 0 } } } SIMD-вариант: go func filterSIMD(values []float32, threshold float32, result []float32) { thresholdVector := simd.BroadcastFloat32s(threshold) ones := simd.BroadcastFloat32s(1) zeros := simd.BroadcastFloat32s(0) var i int var vector simd.Float32s width := vector.Len() for ; i+width <= len(values); i += width { vector := simd.LoadFloat32s(values[i : i+width]) mask := vector.Greater(thresholdVector) output := ones.IfElse(mask, zeros) output.Store(result[i : i+width]) } if i < len(values) { vector, n := simd.LoadFloat32sPart(values[i:]) mask := vector.Greater(thresholdVector) output := ones.IfElse(mask, zeros) output.StorePart(result[i : i+n]) } } Benchmark для обоих одинаковый: go func BenchmarkFilterRegular(b *testing.B) { for b.Loop() { filterRegular(data, 100, result) } } func BenchmarkFilterSIMD(b *testing.B) { for b.Loop() { filterSIMD(data, 100, result) } } Мой компьютер: text Intel Core i7-14700KF Windows Go 1.27.1 10 000 000 float32 И вот что показал benchmark: text BenchmarkFilterRegular-28 228 5070007 ns/op 0 B/op 0 allocs/op BenchmarkFilterSIMD-28 378 3114568 ns/op 0 B/op 0 allocs/op Получается: Обычный Go: ~5.07 мс SIMD: ~3.11 мс То есть примерно 1.63x быстрее. Не 5x и не 10x. Но на такой простой операции с большим массивом почти 39% выигрыша уже выглядит интересно...