13

私はCPUを多用する数値計算アプリに取り組んでいます。多くの詳細に立ち入ることなく、それは大きな整数xに対して特定の関数f(x)を計算することを含む計算数学研究プロジェクトです。

現在、すべてがネイティブ64ビットintを使用してx64モードのC++で実装されています。それは私をx<2^ 64〜1.8 * 10^19に制限します。さらに進んで、それを行うには、128ビット演算を実行するライブラリが必要です。そして、それは非常に高速でなければなりません。特に、整数除算は高速である必要があります。それ以外の場合は、感謝祭まで結果を待つためにここに座っています。そして、私はむしろ車輪の再発明をしたくありません。

ウィキペディアで最大20個の大きな整数ライブラリのリストを見つけましたが、それらのほとんどは任意精度の数値を対象としているようです。これは私のタスクにはやり過ぎであり、それに関連する追加コストは必要ありません。

どのライブラリが128ビット整数で最も速く動作できるか知っている人はいますか?

4

3 に答える 3

16

プラットフォーム/移植性の要件については言及していません。gccまたはを使用する場合は、64ビットプラットフォームでは、無料でclang提供される128ビットタイプが組み込まれています。たぶん、他のプラットフォームにも同様のタイプの拡張機能があります。__uint128_t__int128_t

gccいずれにせよ、幅の2つの整数をアセンブルして幅Nの1つの整数を合成する、対応するジェネリックコードをソースで見つけることができるはず2Nです。これは、その目的のためにスタンドアロンライブラリを作成するための良い出発点になるでしょう。

于 2010-09-11T22:23:34.117 に答える
5

ttmathライブラリはあなたが望むことをします

于 2010-09-15T10:16:27.807 に答える
1

これはすべての人に当てはまるわけではありませんが、私が行うことは、ソースコードを備えた、その他の方法でジョブに適した最高パフォーマンスの任意の整数ライブラリを選択し、固定整数サイズになるようにハックすることです。一部の変数「nbits」をハードコードされた128に変更します。それまではバイト数がわからず、実行時にメモリを割り当てる可能性があります。データがインプレースで構造体を使用するように変更し、データが読み取られるたびに逆参照するポインターを保存します。特定の重要なループを手動で展開します。重要である可能性のあるその他のものはすべてハードコーディングします。そうすれば、コンパイラーは物事を最適化するのが簡単になります。もちろん、これの多くは組み立てであり、今週使用されているテクノロジーが何であれ、派手なSIMDを使用します。

それは楽しいだろう!しかし、その後、プログラマーとして、私は機械語と非常に低レベルのものから始めました。

しかし、私ほど頭がおかしくない人にとっては、おそらく利用可能なライブラリの1つがテンプレートを使用しているか、あるサイズのカスタムコードを生成する手段を持っています。また、一部のコンパイラには、適切な「longlong」整数型があります。

于 2010-09-14T03:26:56.287 に答える