MPFRC++
C++ プログラムで任意の精度が必要なため、多精度浮動小数点 C-libraryではなく、よく知られている軽量の C++ ラッパーを使用していますMPFR
。
私はメモリの問題を抱えています。つまり、amalloc
は MPFR 関数内で失敗します。(興味がある場合は、下部にある小さなエラー メッセージ)。
MPFR マニュアルには次のように書かれています (10 ページ)。
MPFR 関数は、ユーザーが直接 mpfr_const_pi のような関数を呼び出したか、他の関数を計算するためにそのような関数が MPFR ライブラリ自体によって内部的に呼び出されたために、たとえば pi などの定数を計算するときにキャッシュを作成することがあります。
ユーザーはいつでも mpfr_free_cache を使用してさまざまなキャッシュを解放できます。スレッドを終了する前にそれを行うことを強くお勧めします...
私のプログラムは非常にマルチスレッド化されているため、これを使い始める必要があると思いますmpfr_free_cache
。
質問:ラッピング クラスmpfr_free_cache()
のデストラクタ
に単純に配置できますか? これは安全で適切な方法ですか? 問題を解決するのに十分ですか?(メモリリークを正しく特定したと仮定して)
例えば
// mpreal.cpp - ラッパーの実装
namespace mpfr {
class mpreal {
mpreal::mpreal()
{
#if defined (MPREAL_HAVE_CUSTOM_MPFR_MALLOC)
set_custom_malloc();
#endif
mpfr_init2(mp,default_prec);
mpfr_set_ui(mp,0,default_rnd);
MPREAL_MSVC_DEBUGVIEW_CODE;
}
.......
mpreal::~mpreal()
{
mpfr_clear(mp);
mpfr_free_cache(); // ADD THIS TO DESTRUCTOR ?!?!
}
......
私は本業の開発者ではないので、これが本当に問題を解決する最善の方法であるかどうかはわかりません。しかし、すべての OpenMP マルチスレッド領域/for ループに入り込み、mpfr_free_cache()
...
注: スレッドセーフ オプションを使用して MPFR をビルドしました。
興味がある場合は、ここにそのエラーメッセージがあります...
MPFR: Can't allocate memory (size=5864071192896)
[ccmb011:00985] *** Process received signal ***
[ccmb011:00985] Signal: Aborted (6)
[ccmb011:00985] Signal code: (-6)
[ccmb011:00985] [ 0] /lib64/libpthread.so.0 [0x2b952b8cc7c0]
[ccmb011:00985] [ 1] /lib64/libc.so.6(gsignal+0x35) [0x2b952bb09265]
[ccmb011:00985] [ 2] /lib64/libc.so.6(abort+0x110) [0x2b952bb0ad10]
[ccmb011:00985] [ 3] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_default_reallocate+0) [0x2b9529abebd0]
[ccmb011:00985] [ 4] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_tmp_allocate+0x2e) [0x2b9529abec6e]
[ccmb011:00985] [ 5] /users/mmparks/MPFR/lib/libmpfr.so.4(mpfr_mul+0x69d) [0x2b9529a9c5bd]
[ccmb011:00985] [ 6] /users/mmparks/MY_PROGRAM
エラー メッセージで参照されているコード:
ret = malloc (size);
if (ret == NULL)
{
fprintf (stderr, "MPFR: Can't allocate memory (size=%lu)\n",
(unsigned long) size);
abort ();
}