【c/c++】SFMTを使ってみた

SFMTを利用できるようにするまでをまとめます。(※現状上手く動いていません、備忘用メモ程度です……)

ダウンロード

下記URLからダウンロードします。
SIMD-oriented Fast Mersenne Twister (SFMT)

配置

解凍して配置します。
SFMTはビルドしなければ利用できません。また今回は別のプロジェクトで使い回す予定がなかったので、CLionで予めプロジェクトを作成し、そこの中に入れてプロジェクトと一緒にビルドする形としました。
という訳でプロジェクトのフォルダ構成は以下のようになります。SFMT-src-1.5.1直下にヘッダなどが入っています。
f:id:wrongwrongwrongwrong163377:20180420162419p:plain

ビルド設定

今回は下記の1-1を参考にCMakeListsに設定を書きました。
How to compile SFMT
CMakeListsの内容は以下の通りです。SSE利用の設定がどうたらいう話も見ましたが、とりあえず読めていないのでここでは触れません。

cmake_minimum_required(VERSION 3.10)
project(SFMT_Test)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp SFMT-src-1.5.1/SFMT.c)

add_executable(SFMT_Test ${SOURCE_FILES})

利用

ちゃちゃっといた確認用コードは以下です。

#include <iostream>

#include "SFMT-src-1.5.1/SFMT.h"

using namespace std;

int main() {
    sfmt_t sfmt;

    sfmt_init_gen_rand(&sfmt, 0);

    cout << sfmt_genrand_uint64(&sfmt) << endl;
    cout << sfmt_genrand_uint64(&sfmt) << endl;

    cout << sfmt_genrand_uint32(&sfmt) << endl;

    return 0;
}
実行結果
C:\Users\wrongwrong\CLionProjects\SFMT_Test\cmake-build-debug\SFMT_Test.exe
1139168856888879704
6881867631762694802
3373935053
参考にしたページ

www.albow.net

トラブル

コードを以下のように書き換え、32ビット乱数の生成後に64ビット乱数の生成を行うとAssertionが起きています。順序が逆では発生していません。
時間が無いので気が向いたら原因究明までやるかも?

#include <iostream>

#include "SFMT-src-1.5.1/SFMT.h"

using namespace std;

int main() {
    sfmt_t sfmt;

    sfmt_init_gen_rand(&sfmt, 0);

    cout << sfmt_genrand_uint32(&sfmt) << endl;

    cout << sfmt_genrand_uint64(&sfmt) << endl;

    return 0;
}
実行結果
C:\Users\wrongwrong\CLionProjects\SFMT_Test\cmake-build-debug\SFMT_Test.exe
772581976
Assertion failed: sfmt->idx % 2 == 0, file c:\users\wrongwrong\clionprojects\sfmt_test\SFMT-src-1.5.1/SFMT.h, line 167

Process finished with exit code 3