[CUDA-Samples] MersenneTwisterGP11213

目次

CUDA Advent Calendar 2019 5日目の記事です.
ネタのつなぎのCUDA Samples読み回1回目です.
読んでいたもののバージョンが変わってしまうといけないのでこちらにforkしてあります.

何こののサンプル?

CUDAの乱数生成用のライブラリであるcuRANDでメルセンヌ・ツイスタを使って乱数を生成するサンプルコードとなります.
cuRANDはカーネル関数内で使うためのものとホストから呼び出せるものに分かれていると思うのですが,このサンプルは後者のホストから呼び出すためのもののサンプルです.
自分で乱数生成カーネルを書くとあまり性能が出ないので,ホストから呼べるGPUで乱数生成を高速に行ってくれる関数を用意してもらえるのは嬉しいです.

cuRANDのホスト側からの使い方

使い方はとても簡単で,Generatorを作って擬似乱数の生成アルゴリズムを選択して生成関数を呼ぶだけです. メルセンヌ・ツイスタの他にもXORWOWやMRG32K3Aなど,いくつかの疑似乱数生成アルゴリズムを使うことが可能です.[出典]

このサンプルの面白いところ

このサンプルではGPUで並列に生成した疑似乱数列とCPUで生成した疑似乱数列が同じものであるかを比較しています.
これは少しすごいことですよね.
メルセンヌ・ツイスタのような擬似乱数生成器は内部状態を持っており,これによって次に生成する擬似乱数が決まります.
しかし内部状態を共有した上で並列にこれを生成する場合はスレッドの実行される順番が保証されていないため得られる擬似乱数列が実行毎に変わる可能性があります.
しかしcuRANDではCPUで単一スレッドで行った場合と同じ擬似乱数列が得られます.
すごいですよね(擬似乱数生成の並列アルゴリズムを知っている人にとっては当然なのかもしれませんが,私は知らないのでびっくりです).

おわり

使うのは簡単なcuRANDですが,中で動いている処理はとても考えていられるっぽくって素晴らしいです.
自分で疑似乱数生成の生成カーネルを書くとスレッドごとにseedをずらしてごまかして並列生成っぽいものを書いてしまいますが,擬似乱数の周期という性質上あまりよろしくないので,このような関数があると本当にありがたいですね.

カテゴリー:CUDA
記事作成日:2019-12-05