【发布时间】:2017-07-26 19:56:09
【问题描述】:
最近的英特尔芯片(Ivy Bridge 及更高版本)具有生成(伪)随机位的指令。 RDSEED 输出从芯片上的传感器收集的熵生成的“真实”随机位。 RDRAND 输出由真随机数生成器种子从伪随机数生成器生成的位。根据Intel's documentation,RDSEED 速度较慢,因为收集熵的成本很高。因此,RDRAND 作为一种更便宜的替代品提供,其输出对于大多数加密应用程序来说足够安全。 (这类似于 Unix 系统上的 /dev/random 与 /dev/urandom。)
我很好奇这两条指令的性能差异,所以我写了一些代码来比较它们。令我惊讶的是,我发现在性能方面几乎没有区别。谁能提供解释?代码和系统详细信息如下。
基准测试
/* Compare the performance of RDSEED and RDRAND.
*
* Compute the CPU time used to fill a buffer with (pseudo) random bits
* using each instruction.
*
* Compile with: gcc -mdrnd -mdseed
*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <x86intrin.h>
#define BUFSIZE (1<<24)
int main() {
unsigned int ok, i;
unsigned long long *rand = malloc(BUFSIZE*sizeof(unsigned long long)),
*seed = malloc(BUFSIZE*sizeof(unsigned long long));
clock_t start, end, bm;
// RDRAND (the benchmark)
start = clock();
for (i = 0; i < BUFSIZE; i++) {
ok = _rdrand64_step(&rand[i]);
}
bm = clock() - start;
printf("RDRAND: %li\n", bm);
// RDSEED
start = clock();
for (i = 0; i < BUFSIZE; i++) {
ok = _rdseed64_step(&seed[i]);
}
end = clock();
printf("RDSEED: %li, %.2lf\n", end - start, (double)(end-start)/bm);
free(rand);
free(seed);
return 0;
}
系统详情
- 英特尔酷睿 i7-6700 CPU @ 3.40GHz
- Ubuntu 16.04
- gcc 5.4.0
【问题讨论】:
标签: gcc random cryptography x86-64