トップ

ハードウエア乱数の生成速度

目次

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種類の乱数の実行時間を測定する。 hrng.c は疑似乱数なら1億回実行して1回あたり何ナノ秒かかったか表示する。
ハードウエア乱数なら百万回実行して1回あたり何ナノ秒かかったか表示する。
OpenMP が使用可能なコンパイラならば、マルチスレッドでの性能も評価する。
各計測をする前に先頭4つの乱数を表示する。

速度測定プログラム(hrng.c)の対応コンパイラ

対応コンパイラ OpenMP 対応コンパイラ 組込み関数対応コンパイラ ※組込み関数対応コンパイラより古いコンパイラの場合、機械語で対応している。
※組込み関数対応コンパイラでも -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