nitadori / MT607

AVX-512 trials for mersenne twister

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

MT607

AVX-512 trials for mersenne twister

mt607.cpp

状態空間がレジスタ数本に入り切るぐらいのものを書いてみようと思い、メルセンヌ数が607のものを選びました。 32-bitで19語 (607 = 512 + 96 - 1)なので、zmmレジスタ1本とちょっとになります。 係数はMTToolBoxのDCMTで生成したものを使っています。 pos=2かpos=3のときでしかAVX−512でのSIMD化はできません。pos=3だとvalignd命令がひとつ少なくて済むので MTToolBox/DCMT/mt2の出力からpos=3の結果を選んで使っています。 posを固定して係数を生成する方法、どなたかご存知ではないでしょうか?

なお、SIMD化前後で同じ値になることの確認はしてありますが、SIMD化前の実装も私の手書きのため正しいものである保証はありません。ご了承ください。

mt19937ar-cok.c

公式ページで配布されているものにAVX-512での状態一括更新を加えてみたものです。 オリジナルでは状態の型がunsigned longだったのですが、さすがにLP64の環境では使い難いのでこの部分はuint32_tに置き換えてあります。 最も標準的なパラメタのmt19937_32のSIMD化となっています。

しかし状態更新だけSIMD化してもtemperingの方が重そうですね。 しかしこの部分をSIMD化してキャッシュしておくのに624 int32 = 39 zmm = 2496 byteものメモリを消費してもよいものか。 この1/3の208 int32 = 13 zmm = 832 byteぐらいなら許されるのかもしれません。

About

AVX-512 trials for mersenne twister


Languages

Language:Assembly 76.3%Language:C 16.6%Language:C++ 7.1%