いくつかの非常に大きな整数 (約 2 の 1 億乗) を処理するアルゴリズムをほぼ完成させました。このアルゴリズムはメモリ集約型ではないため、十分なメモリを備えた 16 コア サーバーで高度に並列化されたコードを実行するには、数時間かかります。.NET 4 で BigInteger クラスを利用します。
アルゴリズムの詳細は重要ではありませんが、コンテキストのために、これらの整数に対して実行される操作の完全なリストと、アルゴリズムのいくつかの顕著な機能を以下に示します。
- 足し算・引き算。
- 大きな数と小さな数の掛け算。
- 大きな数を非常に小さな数 (2 など) で割る。
- ベース 2 ログ。
- ベース 2 パワー。
- 2 つ以上の大きな数値 (最小/最大) の比較。
- 素数の関与は一切ありません。
- メモリアクセスのパフォーマンスへの影響は、一部のスマートなオンザフライ計算のパフォーマンスへの影響よりも大きいため、このアルゴリズムはメモリを集中的に使用しないように特別に設計されています。それにもかかわらず、メモリアクセスが改善されれば、アルゴリズムは合理的に利益を得ることができます.
コードを可能な限り最適化した結果、プロファイリングでボトルネックが 2 つだけ表示されるようになりました。
- このような大きな数の基数 2 の対数を計算します。
- これらの数値の 2 進数の定義済みパターンをチェックしています。これは、BigInteger の基になるデータにアクセスする唯一の方法は、インプレース操作ではなく ToByteArray を最初に使用することであるためです。また、バイトサイズのチャンクを操作してもパフォーマンスは向上しません。
メモリ アクセスとログ操作を考慮して、GPU と、一部の作業を効果的にオフロードできるかどうかについて考え始めました。GPU については、浮動小数点演算用に最適化されていること以外はほとんど知りません。
私の質問は、GPU .NET のようなライブラリを使用して、GPU でこのような大きな数を処理するにはどうすればよいですか? 浮動小数点の最適化を利用して、このような大きな数の Log を計算することはできますか?
戦略を立てるための出発点を探しています。