私は RSA の課題を解決するプログラムを書こうとしています (はい、興味深い目標があります)。現在、64 ビットの Linux ボックスを持っていません。これまでに終了するチャンス。したがって、アセンブラー プログラミングを行うことはできますが、C++ を使用することをお勧めします。ただし、インラインアセンブリを使用して同じことを行う方法にも興味があります。ここでの計画は、16 個の 64 ビット汎用レジスターと 128 ビット sse レジスターを使用して (非常に長い) 整数演算を行うことです。そのため、それを行う方法についての助けをいただければ幸いです。
3 に答える
BarsMonsters anser へのコメントに基づいて、CPU に近づく必要はなく、大きな整数ライブラリが必要です。
1 つのオプションは、任意の整数演算を含む gmp です。大きな整数の乗算などの優れたアルゴリズムを備えており、優れたコンパイラは、ほとんどの人よりもこれを最適化するのに優れています。
代替手段を探す主な問題は、可変精度演算がサポートされていることです。これは、数値が 2 進数で最大 512 桁であることが確実にわかっている場合は、回避したいオーバーヘッドになる可能性があります。それでも、おそらく低レベルのトリックよりもアルゴリズムを調べたいと思うでしょう (長い乗算は、そのサイズでは既に悪い選択かもしれません)。コンパイラーに最適化を任せた方が良いと確信しています。
私のアドバイスは、マシンがはるかに安定して何十億倍も速くできることではなく、人間の知性を必要とすることに時間を費やしてください。
そして、コンパイラよりもマシンコードを本当に最適化できる場合は、LLVM をダウンロードし、そのロジックを最適化パスとして実装してください。
最新のコンパイラはすべて、利用可能なすべてのレジスタを再利用して、可能な限り高速なコードを生成することに非常に優れています。
特に Intel C++ と GCC3 は、手動で無敵のコードを作成することがよくあります。
ところで、これをチェックしてください: MSVC が AMD64 および Itanium ターゲットのインライン アセンブリをサポートしないのはなぜですか?
正確な数学を実行したいだけなら、Intel C++ コンパイラを試して、その数学ライブラリを使用することをお勧めします。これは非常に強力で過度に最適化されています。Boost 数学ライブラリも同様です。これにより、作業が 90% 削減される可能性があります :-) 任意の精度数がサポートされています。