2011-08-31 27 views
3

私は数日間MINGWの下にGMPライブラリをインストールしようとしてきました。私は週数__uint128_tをlinux64ビット環境下でgccで使用していましたが、GMPとmingw(32ビット版)の下で同じプログラムを移植しました。 __uint128_tの代わりにmpz_classの整数を使用しました。それから、私は新しいプログラムを始めて...! __uint128_tと64ビットで完了するまでに16分かかり、GMPとMINGWでは91時間かかる!gmpで固定サイズの整数...?

少しスピードアップするにはどうすればよいですか? 32ビット環境下で128ビットの整数演算を高速化する方法はありますか?私は128ビット以上は必要ないので、GMPに "何かを伝える方法はありますか?いいえ、私はちょうど128ビットが必要です。

+0

128ビットでどのような操作を行う必要がありますか? ( '+'、 '-'、' <'/'> '、' * '、'/'、もっと興味深いものです) – osgx

+0

64ビットはコンパイラによってネイティブにサポートされています。 32ビット単位を使用して64ビット算術演算を行うコードを見つけ、64ビット単位を使用して128ビット単位に対してそれを実装するための原則を使用します。これはネイティブの128ビットサポート(例えばSSEで手に入れることができるかもしれませんが)ほど速くはありませんが、おそらくlibgmpより速いでしょう。 – user786653

+0

64ビットはコンパイラでサポートされていますが、除算(およびモジュロ)や乗算のようなものは、実際の64ビット環境(IOW、64ビットレジスタなど)ではるかに高速です。 –

答えて

3

いいえ、mpz_tを使用している場合、GMPを固定長整数に制限することはできません。 mpz_tは、手足配列(割り当てられた;使用されている)の長さとint(手足; int32またはint64の配列)の配列として格納されている実際の値へのポインタを持つ構造体です。 GMPは、それが大きくなるとどんな値の長さを拡張する準備ができています。

あなたはmpz_init2を使用して、初期化時にすべてのmpz_tのための128ビットを割り当てることができます。

mpz_init2(mpz_t*, bit_number); 

しかし、これからの高速化が少なく、データ・間接および長ハンドリングが依然として存在します。

あなたはmpn_低レベル関数への切り替えに直接手足を使用することができます。

http://www.gnu.org/software/gmp/manual/html_node/Low-level-Functions.html#Low-level%20Functions

手足へのポインタ(これはキャッシュのために良いです)、簡単な入力/出力コードはございません。自動四肢のサイズ処理(自動拡張も割り当てもありません)。すべてのストレージを自分で行う必要があります。いくつかのキャリーは手動で処理する必要がありますが、GMPの高速な*,/および%の操作があります。 mpz_t t;t._mp_size = t._mp_alloc=limb_number;t._mp_d=pointer_to_limb_arrayで簡単な入出力のためにmpz_tを再構成することができます。

また、64ビットmingwに切り替える場合は、uint128_tを使用することもできます。

+0

そして、mpz_init2を使って、128ビットを割り当てることは、それをもっと速くすることでしょう。 –

+0

@マッテオ彼は「しかし、これからのスピードアップは小さい」と述べた。 –

+0

@セス(ありがとうございましたが、彼は答えを編集しました!:D私は以前見たことがありませんでした!) –

1

対象とするWindowsマシンが64ビットWindows(Vistaまたは7など)に同梱されている場合は、代わりにMinGW-w64を使用できます。

関連する問題