- シミュレーションを並列処理するとき、同一のシードからスタートした同一の疑似乱数列を使うことになる。理事乱数列としてjavaで使っていたメルセンヌ・ツイスターを使うべく、C用のソースを入手して、CUDAのホストコードに使ってみることにする。
- メルセンヌツイスターについては、こちらを参照
- 今回は、上記サイトの末尾にある、「関数本体の入った.cファイルと関数プロトタイプ宣言の入った.hファイル、そしてテスト用のメイン関数の入った.cファイルの三つに分割」になったgzipped tar-file of these files: mt19937ar.sep.tgz . を使用。
- CUDAホストとしては、CUDAゾーン提供の、「transpose(行列置換)」プロジェクトを使用
- 一昨日の記事のように、プロジェクト名を"transpose"から"transposeMT"に変更するべく、Makefileに始まり、各プロジェクト名特異的な表現を"transposeMT"に変えた。
- それ以外のソースの変更としては、mt19937ar.sep.tgzのmain関数を利用して、"transposeMT.cu"内に、メルセンヌ・ツイスターでの乱数発生のための記述をするとともに、それを可能にするために、ヘッダー行を追加
// includes, project
#include <mt19937ar.h>
// includes, kernels
#include <mt19937ar.c>
-
- ソースコードの追加分(以下の他、floatをintに変えるなど、こまごまとした変更箇所、複数)
//Use MersenneTwister to generate pseudo random values
init_genrand((unsigned long)time(NULL));
for( unsigned int i = 0; i < (size_x * size_y); ++i)
{
//h_idata[i] = (float) i; // rand();
h_idata[i]= genrand_int32();
//printf("Random value %lu by MersenneTwister\n", h_idata[i]);
}
-
- 疑似乱数列発生にあたって、シードは、time(NULL)で与えていますが、それについては、こちらを参照
- CUDA-SDKのプロジェクトとして動くソース一式はこちらから
- ファイルうちわけ
- Makefile
- transposeMT.cu: ホストコード
- transposeMT_kernel.cu: デバイスコード
- transposeMT_gold.cpp
- mt19937ar.c: メルセンヌ・ツイスターの関数コード
- mt19937ar.h: 同、ヘッダーファイル
- CUDA-SDKのプロジェクトディレクトリ配下に、適当な名前のディレクトリを切り、そこにこれらを入れ、"make"すれば、"bin/linux/release/"以下に、"transposeMT"なる実行可能ファイルができます