SFMTの針データベース作成プログラム

SFMTの針データベースを作成するプログラムを公開します.最終的なDBの容量は16GB,作成にかかる時間は30分程度です.

ソースコード

https://github.com/RNGeek/QR-Database においてあります.

簡単な解説

大まかにプログラムの流れを説明します.

32bitの初期seedを総当りする部分

417消費以降の針7つを32bit整数にエンコードします.針を7つに抑えることによって針の表現が32bitで済みます.ここで12個針を取って64bit整数にエンコードしてもいいですが,検索する時の性能に差はないことや,ファイルサイズの大きさから,採用しませんでした.またこの部分はOpenMPを用いて並列化しています.
次にエンコードした32bit整数の100で割った余りを計算し,その値によって決まるファイルに初期seedと合わせた64bit整数を書き込みます.これは1つのファイルに初期seedと針の情報を全て書き込むのではなく,100個のファイルに分割して保存するためです.こうすることで後述のソートを行う時にメモリ上でソートできます.

ソート部分

32GBのデータをソートしようとすると大抵のマシンではメモリが足りないため,外部ソートを行う必要があります.しかし上にも書いたように100個ファイルに分割したことで,ファイル1つは320MB程度の大きさになります.これはメモリに乗る大きさです.ソートには parallel-radix-sort を使いました.
また,最終的なデータの書き出しは初期seedのみに限ることでトータルのファイルのサイズを半減しています.

検索部分

検索にはソート済みデータに対して高速に検索を行える二分探索を採用しました.針7つでは初期seedを完全には絞り込めないので,実際に針の値を計算して妥当性を判定しています.

必要な開発環境

コンパイルができると確認している環境は,Windowsではmsys2のみです.Visual Studioでコンパイル可能かは検証していません.
それとソースコードをZIPでダウンロードした場合,SFMTparallel-radix-sortに関するフォルダは空になっているので気をつけてください.