AnnulusGames / BurstLinq

Extremely fast LINQ aggregation operations implementation optimized by Burst Compiler

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

min maxの仕様について

Akeit0 opened this issue · comments

armとx86でsimd minmaxの仕様が違うようで、armはnanを考慮するけど、x86は考慮しないみたいです。
armmax(a, b)=>double.IsNan(b)||a>b?a:b;
x86max(a, b)=>a>b?a:b;
みたいな感じです。
armはarm maxじゃないとsimd効かず遅くなる、x86はarmmaxにすると演算が2つ増えるけどsimdは効くからちょっと遅くなるみたいです。
simdlinqではx86前提なので、x86maxです。
仕様はどうしますか?

挙動としてはNaNチェックがあった方がいいですが(実際C#のLINQにはNaNチェックがあります)、実際NaNが入るケースはほとんどないため、十分なパフォーマンスの改善が見られるのであればチェックを行わない方針で問題ないと思います。
必要があればEnumerable.Minを使ってもらうという方向でいいかと。

プルリクエストしました。x86で4倍ほど差が出たので、NaNチェックはNeonのみとしました。