トップ
ハードウエア乱数の生成速度
目次
Linuxの脆弱性軽減策の無効化の方法
インテル CPU の rdrand/rdseed には
CrossTalk(SRBDS:Special Register Buffer Data Sampling)という脆弱性がある。
Linux ではその軽減策をしているため rdrand の実行時間が Windows に比べて
最悪の場合約40倍になる。AMD の CPU は私は所持していないので確認をしていない。
軽減策は CPU の rdrand/rdseed 命令のマイクロプログラムを変更しているため、
ユーザープログラムから軽減策を無効にすることはできない。
例えば Windows で rdrand を使ったプログラムを作成してよい性能が出ていたとしても、
それを Linux + wine で実行すると rdrand の実行時間は軽減策の影響で遅くなる。
rdrand/rdseed を多用して性能がプログラムの性能に大きく関わってくる場合は
rdrand/rdseed を疑似乱数に書き換えた方がよい。
マルウエアに感染していないことが分かっていて、
rdrand/rdseed を多用したい場合はこの軽減策を無効にする方法がある。
無効にするにはカーネルコマンドラインに "srbds=off" を加える。
具体的には、例えばsudo vi /etc/default/grub
sudo gedit /etc/default/grub
等のように /etc/default/grub をテキストエディタで編集して
10行目かその前後にGRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
とあったら
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash srbds=off"
のように srbds=off を加えて保存終了し、
sudo update-grub
を実行しOSを再起動する。
速度測定プログラム(hrng.c)の概要
hrng.c は以下4種類の乱数の実行時間を測定する。
- LCGs は高速だが周期が2³²と短く、偶数と奇数が交互に現れる等低品質である。
- TinyMTは周期が2¹²⁷-1もあり良く検定されている。
- rdrand は rdseed よりもシングルスレッドで3倍くらい高速である。
rdrand は物理乱数と疑似乱数を組み合わせている。
最大で 1022 個かそれ以下の疑似乱数を発生させると種が物理乱数で更新される。
さらにスレッド数に比例してスループットが高くなる。
rdrand 命令が失敗することは殆どない。
- rdseed は最も予想が困難な乱数である。
シングルスレッドでもマルチスレッドでもスループットは同じである。
rdseed 命令は脆弱性軽減策が有効な時は失敗しないが、
脆弱性軽減策が無効な時は失敗することがよくある。
失敗した場合、プログラムは成功するまで _mm_pause() を
64 回行いながら rdseed を繰り返す。
hrng.c は疑似乱数なら1億回実行して1回あたり何ナノ秒かかったか表示する。
ハードウエア乱数なら百万回実行して1回あたり何ナノ秒かかったか表示する。
OpenMP が使用可能なコンパイラならば、マルチスレッドでの性能も評価する。
各計測をする前に先頭4つの乱数を表示する。
速度測定プログラム(hrng.c)の対応コンパイラ
対応コンパイラ
- Borland C++5.5.1
- Visual C++5.0~
- gcc/g++
OpenMP 対応コンパイラ
- Visual C++2005~
- gcc/g++ 4.2~
組込み関数対応コンパイラ
- Visual C++2013~
- gcc/g++ 9.0~
※組込み関数対応コンパイラより古いコンパイラの場合、機械語で対応している。
※組込み関数対応コンパイラでも -DNO_BUILTIN を指定すると機械語で対応する。
速度測定プログラム(hrng.c)のソースコード
速度測定プログラム(hrng.c)の結果
Core i5-10210U 1.60GHz 2.10GHz
Ubuntu 22.04 srbds
gcc -O4 -Wall -fopenmp hrng.c
LCGs sth d3dc167e a70427df d6651c2c 0daa96f5 1.16 nsec Err= 0.000%
LCGs omp df63578a 7b93e308 234baf92 cb037c1c 0.14 nsec Err= 0.000%
TinyMT sth 603155f1 82215390 1fcd0635 ba561fd8 3.36 nsec Err= 0.000%
TinyMT omp 48a3f287 2529e569 cb029379 e5f1528f 0.70 nsec Err= 0.000%
Rdrand sth 18de5634 ece3b620 1821a6d7 60a29b86 1164.00 nsec Err= 0.000%
Rdrand omp d1adaae2 c549c26a 9f426a11 83569030 975.00 nsec Err= 0.000%
Rdseed sth 9f933414 53bcf062 0d6f8239 efeb25a6 1164.00 nsec Err= 0.000%
Rdseed omp c62bb95f ae3eaa17 4aa4cacd edda1b21 977.00 nsec Err= 0.000%
omp_get_num_procs()=8 Sum=292897177
Core i5-10210U 1.60GHz 2.10GHz
Ubuntu 22.04 srbds=off
gcc -O4 -Wall -fopenmp hrng.c
LCGs sth d3dc167e a70427df d6651c2c 0daa96f5 1.18 nsec Err= 0.000%
LCGs omp df63578a 7b93e308 234baf92 cb037c1c 0.15 nsec Err= 0.000%
TinyMT sth 603155f1 82215390 1fcd0635 ba561fd8 3.35 nsec Err= 0.000%
TinyMT omp 48a3f287 2529e569 cb029379 e5f1528f 0.70 nsec Err= 0.000%
Rdrand sth 0ed8711b f225abf5 2cac5d3d 77f0a8ca 123.00 nsec Err= 0.000%
Rdrand omp c0b3782f 587f935f 383a6029 a7128e7f 25.00 nsec Err= 0.000%
Rdseed sth b0e5b581 b93251e5 e54eacea 2ec0cfec 439.00 nsec Err= 12.617%
Rdseed omp 6d05954c 85ed0543 534ff21f f3b94ff7 473.00 nsec Err=132.655%
omp_get_num_procs()=8 Sum=2808607595
Core i5-10210U 1.60GHz 2.10GHz
Windows 10 Pro 22H2
VisualC++2022 /O2 /openmp
LCGs sth d3dc167e a70427df d6651c2c 0daa96f5 0.93 nsec Err= 0.000%
LCGs omp df63578a 7b93e308 234baf92 cb037c1c 0.21 nsec Err= 0.000%
TinyMT sth 603155f1 82215390 1fcd0635 ba561fd8 4.10 nsec Err= 0.000%
TinyMT omp 48a3f287 2529e569 cb029379 e5f1528f 3.59 nsec Err= 0.000%
Rdrand sth c643584c 423eff55 dbbdf8fb 955fbe70 144.00 nsec Err= 0.000%
Rdrand omp 12333332 6d014e07 7ff1c597 e21c4110 34.00 nsec Err= 0.000%
Rdseed sth 3ecdd9c2 6d65831f 4a9e3a78 b9a5133b 487.00 nsec Err= 12.540%
Rdseed omp de87ce97 cd0a9f8a d21ef7c4 af07d720 573.00 nsec Err=113.907%
omp_get_num_procs()=8 Sum=450198964
Core i5-10500T 2.30GHz
Windows 11 Pro 22H2
VisualC++2022 /O2 /openmp
LCGs sth d3dc167e a70427df d6651c2c 0daa96f5 0.98 nsec Err= 0.000%
LCGs omp df63578a 7b93e308 234baf92 cb037c1c 0.10 nsec Err= 0.000%
TinyMT sth 603155f1 82215390 1fcd0635 ba561fd8 4.14 nsec Err= 0.000%
TinyMT omp 48a3f287 2529e569 cb029379 e5f1528f 1.91 nsec Err= 0.000%
Rdrand sth 098bd4fc 93fb1964 2d1c7e7f 0fe42297 115.00 nsec Err= 0.000%
Rdrand omp 82d10f77 57353e32 847cff32 6640097a 23.00 nsec Err= 0.000%
Rdseed sth 9c9f82ab 9fa34465 01d198f7 e517b4b9 972.00 nsec Err= 29.938%
Rdseed omp f0e886dd 0eebf995 e725628c 3cd7e229 382.00 nsec Err=142.273%
omp_get_num_procs()=12 Sum=786386285