C++11 通过该库支持伪随机数生成<random>。
我看过多本书籍,其中提到持续构建和销毁std::random_device, std::uniform_int_distribution<>,std::uniform_real_distribution<>对象的成本非常高,并且他们建议在应用程序中保留这些对象的单个副本。
为什么创建/销毁这些对象的成本很高?这里的贵到底是什么意思呢?就执行速度、可执行文件大小或其他方面而言,它是否昂贵?
有人可以提供一些解释吗?
最近的英特尔芯片(Ivy Bridge及其上)具有生成(伪)随机位的指令.RDSEED输出从芯片上的传感器收集的熵产生的"真实"随机位.RDRAND输出由真随机数发生器播种的伪随机数发生器产生的比特.根据英特尔的文档,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 = …Run Code Online (Sandbox Code Playgroud) 英特尔C++编译器和/或GCC是否支持以下内在函数,例如自2012/2013年以来MSVC的内在函数?
int _rdrand16_step(uint16_t*);
int _rdrand32_step(uint32_t*);
int _rdrand64_step(uint64_t*);
int _rdseed16_step(uint16_t*);
int _rdseed32_step(uint32_t*);
int _rdseed64_step(uint64_t*);
Run Code Online (Sandbox Code Playgroud)
如果支持这些内在函数,那么它们支持哪个版本(请使用编译时常量)?
我正在使用Intel Ivy Bridge CPU,并且想使用RDRAND操作码(https://software.intel.com/zh-cn/articles/intel-digital-random-number-generator-drng-software-implementation-guide)在C#中。
如何通过C#调用此CPU指令?我在这里看到了一个从c#执行汇编代码的示例:C#中的x86 / x64 CPUID
但是我不确定如何将其用于RDRAND。该代码不需要检查执行该代码的CPU是否支持该指令。
我已经看过这个C ++示例,它执行来自Intel的drng_samples的汇编字节代码:
int rdrand32_step (uint32_t *rand)
{
unsigned char ok;
/* rdrand edx */
asm volatile(".byte 0x0f,0xc7,0xf0; setc %1"
: "=a" (*rand), "=qm" (ok)
:
: "edx"
);
return ok;
}
Run Code Online (Sandbox Code Playgroud)
如何将在C#中执行汇编代码的示例与来自英特尔drng示例代码的C ++代码结合起来?
rdrand ×3
assembly ×2
c++ ×2
gcc ×2
random ×2
c# ×1
c++11 ×1
cryptography ×1
icc ×1
intel ×1
intrinsics ×1
performance ×1
x86-64 ×1