IntelのCPUではsubnormal浮動小数点数の演算が45倍遅くなる
Subnormal floating-point numbers are expensive on Intel processors

IEEE標準のsubnormal数は演算を遅くすると知られ、ゲームや機械学習の現場では避けられることがある。Daniel Lemire氏がC++ベンチマークでIntel、AMD、Armの最新CPUを比較したところ、IntelのGranite RapidsとEmerald Rapidsではsubnormalを含む乗算が通常の45〜50倍遅く、除算も18倍遅かった。依存チェーンでは1ステップあたり1ns未満が30ns超に膨らむ。一方、AMD Zen 5は乗算・加算が全速で動き、ArmのGraviton 5とApple M4 Maxはsubnormalを全く気にしない。
Intelのプロセッサでは、subnormal数を含む乗算は通常の数の乗算より約45〜50倍遅い。除算は18倍遅い。
HNでの議論
45- cesaref
かつてDSPコードを書くときには、subnormalの領域に落ち込むのを避けるために、入力に低レベルのランダム信号を加えるのはごく普通のことだった。アルゴリズムを注意深く解析すれば、これが同様に必要な箇所(たとえばディレイを実行する際のフィードバック経路など)を特定できた。
言うまでもなく、56kの固定精度コードを書く幸運(あるいは不運)に恵まれた人たちはこんな心配はなかっただろうが、代わりに別の悩みがあった :)
最近はflush to zeroがおそらく好まれる戦略だろうと思う。
- khuey
subnormalが_必要_でないなら、MXCSR.DAZ/FTZ(gccでは-mdaz-ftzで設定できる)を使えば、こうしたことをすべて無視できる。
- pixelpoet
これは何年も前から、少なくともCore 2 Duoの時代からずっとそうだ。
- juancn
どうやらこれはPコアでのみ発生するらしく、最近のEコアにはsubnormal用の高速パスがある。
- gwbas1c
subnormal数とは何なのか、いまだに理解しようとしているところだ。つまり、自分がそれを使っていて、もっと学ぶ必要があるかどうかを知るのに十分なだけのTLDRを探している。
残念ながら、Wikipediaの記事はおそらく正確ではあるものの、明確で簡潔な答えを与えてくれない。
つまり、0.0001はsubnormalなのか?それとも0.000000000000000000001なのか?