ぺんぎんさんのおうち

日記です。たまに日記じゃないこともあります。

23.02.2024

牡蠣食って帰ってきて、元気だったら修正する。

C++ならスマートポインタ使えよ←やめてね📮👍
double型よりも精度が良くて、配列の要素ごとに計算できるモジュールが欲しい。要するにnumpy.array(dtype=float)に勝ちたい。 自力で実装しても絶対勝てないのでGMPに頼ることにする。GMPに頼っても勝てる気がしねえぜ。

bench1: mpf_tとmpf_t->_mp_d用にmallocでメモリを動的に確保する。定数を記述して、コンパイル時にメモリサイズがわかるように。
bench2: mpf_t用にmallocでメモリ確保を行う。_mp_dのメモリ確保はmpf_initを通してGMPにやってもらう。
bench3: 1と似ている。mpf_tとmpf_t->_mp_d用にメモリを動的に確保する。確保するメモリサイズは変数nで指定。ただしnはコンパイル時にわかっている(nは関数の呼び出し元で定義)。
bench4: std::vector<mpf_class>を使う。sample分のstd::vectorのメモリ確保に加えて、mpf_classのコンストラクタ(や値のセット)でもメモリ確保が走る。

速度は、3 > 1 > 4 > 2の順で速い。malloc(定数をベタ書き)よりもmalloc(変数を渡す)のほうが速いのが驚き。数値が小さいと変わるかな。ほんとはmalloc使いたくないけど、サイズが大きいとスタックに乗り切らずにSegmentation Faultするので諦めた。

numpy.array(dtype=float)は64ビット精度だけど、計算時には内部で128ビットのレジスタと使っているという話を聞いたことがある。実装コードが見つからないので知ってる人がいたら教えて欲しい。今回はPRECを64*4にしているのでnumpyよりも精度は倍。PRECを大きくすると当然速度は落ちる。

mpf_t init benchmark