ROUNDSD(浮動小数点数を整数に変換する)用に定義した定数を流用した感を醸し出している。筆者を含めて、AVX512用のコードを動かせるマシンが手元にないという人も多いだろう。その場合は、Intelが出しているエミュレーター(sdeとかいうやつ)を使えば良い。クラウドでAVX512が使えるマシンを借りるという手もあるだろう。CUDACUDAには丸めモードを指定して演算できる組み込み関数/命令があるらしい。GPGPUはあまりやったことがないのでここでは詳しくは触れない。RISC-VRISC-Vは最近流行りの、新しいプロセッサアーキテクチャである。後発なだけあって、いろいろ筋の良い設計をしている、らしい。RISC-Vの仕様はいくつかの細かい仕様に分かれていて、実装者が必要な仕様を選んで実装できる(不要な機能は実装しなくても良い)。整数の乗算もオプショナルである。組み込み向けのマイコンでは浮動小数点数は省略されがちだが、RISC-Vの浮動小数点数も当然オプショナルである。Q(四倍精度)のそれぞれがある。Qの各仕様では、命令のうち3ビットを使って丸めモードを埋め込むことができる。x86系やARMの制御レジスタでは丸めモードは4通りだったので2ビットで済んでいたが、4通りの丸めモードの他に「動的な丸めモードを使う」指定と、IEEE754-2008で規定された「roundTiesToAway(最近接丸め、ただし最も近い数が2通りある場合は絶対値が大きい方を採用)」を指定するために、3ビット使うようになっている。(roundTiesToAwayに対応しているのがいかにも後発のアーキテクチャという感じがする。)ただ、浮動小数点数の使えるRISC-Vマシンを個人が気軽に入手できる未来はもうちょっと先な気がする。Unleashedというやつは浮動小数点数も使えるみたいだが、個人にはちょっとハードルが高い。プログラミング環境的な意味でも、丸めモード指定で遊べるのはもうちょっと先になりそうだ。GCCのビルトイン関数を見てもRISC-Vの丸めモード指定に対応しそうなものは見当たらない。18661-1と2で、C2xにマージしたドラフトはn2314/n2315あたりを見れば良さそう)。相当の呼び出しを挿入したり対応する機械語の命令を挿入したり、あるいはスコープ内の演算を静的な丸めモード指定付きの命令に置き換える、みたいなことをすることになるのだと思う。intrinsicsLLVMの命令にも静的な丸めモードを指定できるものがあるようだ(ただし現段階では実験的なもので、今後どうなるかはわからない。そもそも現段階でどういう実装がされているのかもry)。Intrinsicsというやつに丸めモードを指定できるらしい。それに相当する命令を実行する必要がある。...という風にドキュメントからは読める。以前の記事で最後に紹介した「Haskellで浮動小数点数の丸めモードを制御するライブラリー」だが、数ヶ月放置した後、最近またいじり始めている。関数は丸めモードを(グローバル変数ではなく)引数として指定できるようになっている。Haskellのユーザーに対しては「静的な丸めモード指定」のできるインターフェースを提供していることになる。実行時の効率はともかくとして。対応したいと考えている。この記事に書いた方法でARMにも対応できるはずだが、筆者がARMでのHaskell環境を構築できていないので、対応するのは当分先のことだろう。JavaScriptやJavaやWebAssemblyなど、非ネイティブなGHCバックエンドのことも想定して、FFIを使わない実装も用意する。丸める」実装なので劇遅だが、twoSum等のアルゴリズムを使えばもう少し高速化の余地はあるだろう。いえ、初期リリースに関してはあまり欲張らずに、なるべく早く出したい。mod_poppo2019年振り返りコメントを残す去年に引き続き、一年の振り返りをしたいと思う。