円周率の計算(整数環FFT、複素FFT、X64)

(2016.7.24作成)
やることがないので昔と同じくチビチビと改造(改善?)して実験していました。
単一の整数環FFTでは、モジュラー数が160ビットの場合が一番高速になりました。
複素FFTは、SSE系の命令が利用できる52ビット浮動小数点計算が有利なのですが、処理桁数を大きくするには処理単位を8ビットずつにする必要があり、桁数の大きい範囲では64ビット浮動小数点計算の方が優りました。
64ビットモードでも160ビット整数環FFTを作ってみましたが、期待したほど早くはなりませんでした。最適なモジュラー数の範囲がもう少し大きいのかもしれません。インラインアセンブルコードが使えないので作るのに少々疲れました。いずれ288ビットか316ビット版を作って試したいとは思います。
そしてもう一種類、複数の整数環FFTを合成して、より大きい整数環と同等の結果を得る方式も試してみました。
モジュラー数を32ビットとすると、8ビットずつの処理でも数万桁しか扱えませんが、それを3組使って合成すると、96ビット整数環FFTと同等になり、32ビットずつの処理でも232桁が扱えることになります。最初に解説を見たときは実用になるのかな(原理だけの話かな)と勘違いしておりました。でも考えてみたら、単一で96ビット演算にすると、32ビット乗算が9倍必要ですが、32ビット演算を3組実行する場合は3倍で済みますので、こちらを先に試した方が良かったかも...。
実際には、3組での途中実験で早くなりそうだったので、単一版との比較の意味もあり32ビット5組の合成(160ビット相当)版を作りました。旧PC(WinXP(32bit)、CPU: AMD Athlon 64X2 Dual Core Proc 5400+ CLK 2.8GHz)では最速版になりました。

それらの性能は以下のようになりました。

試験PC: HP 1000-1401(Win10、 CPU: Intel Celeron CPU B830 CLK 1.8GHz)
(1)32ビット版 単一整数環FFT(P=2153*63+1)
   チュドノフスキーの公式で約2000万桁: 約350秒
(2)32ビット版 64ビット浮動小数点複素FFT
   チュドノフスキーの公式で約2000万桁: 約320秒
(3)32ビット版 複数整数環FFT
    (P1=225*74+1、P2=225*68+1、P3=225*63+1、P4=225*60+1、P5=225*54+1)
   チュドノフスキーの公式で約2000万桁: 約380秒
(4)64ビット版 単一整数環FFT(P=2153*63+1)
   チュドノフスキーの公式で約2000万桁: 約260秒
(5)y-cruncher v0.5.5 Build 9180 (fix 2) (www.numberworld.org) (x64 SSE4.1 - Windows ~ Ushio)
    © 2008-2011 Alexander J. Yee ( a-yee@u.northwestern.edu )
   チュドノフスキーの公式で約2500万桁: 約56秒
(6)Super π for Windows(Ver 1.1) (©Kanada Labo. University of Tokyo)
   1677万桁: 約525秒

小さい桁では52ビット浮動小数点FFTが最も高速です。
(1)32ビット版 52ビット浮動小数点複素FFT
   チュドノフスキーの公式で約250万桁: 約21秒
(2)Super π for Windows(Ver 1.1) (©Kanada Labo. University of Tokyo)
   209万桁: 約51秒

(注)自作版は16進出力なので、基数変換をやると何割か遅くなります。

≪参考文献・記事≫
FFTと多数桁乗算No.2 多数桁乗算の各種方法 (2007年5月 後保範)