AVX-512 trials for mersenne twister
状態空間がレジスタ数本に入り切るぐらいのものを書いてみようと思い、メルセンヌ数が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化前の実装も私の手書きのため正しいものである保証はありません。ご了承ください。
公式ページで配布されているものに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ぐらいなら許されるのかもしれません。