GPGPUでシミュレーション

  • シミュレーションを並列処理するとき、同一のシードからスタートした同一の疑似乱数列を使うことになる。理事乱数列として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のプロジェクトとして動くソース一式はこちらから
    • ファイルうちわけ
    • CUDA-SDKのプロジェクトディレクトリ配下に、適当な名前のディレクトリを切り、そこにこれらを入れ、"make"すれば、"bin/linux/release/"以下に、"transposeMT"なる実行可能ファイルができます