相关疑难解决方法(0)

为什么随机设备创建成本昂贵?

C++11 通过该库支持伪随机数生成<random>

我看过多本书籍,其中提到持续构建和销毁std::random_device, std::uniform_int_distribution<>,std::uniform_real_distribution<>对象的成本非常高,并且他们建议在应用程序中保留这些对象的单个副本。

为什么创建/销毁这些对象的成本很高?这里的贵到底是什么意思呢?就执行速度可执行文件大小或其他方面而言,它是否昂贵?

有人可以提供一些解释吗?

c++ random performance c++11

31
推荐指数
2
解决办法
2637
查看次数

Ivy Bridge上RDRAND指令的延迟和吞吐量是多少?

我在agner.org上找不到有关RDRAND指令的延迟或吞吐量的任何信息.但是,这个处理器存在,所以信息必须在那里.

编辑:实际上最新的优化手册提到了这条指令.它记录为<200个周期,Ivy Bridge上的总带宽至少为500MB/s.但是由于延迟和吞吐量是可变的,因此对该指令的一些更深入的统计将是很好的.

assembly intel rdrand

30
推荐指数
2
解决办法
5021
查看次数

RDSEED和RDRAND之间的性能差异可以忽略不计

最近的英特尔芯片(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)

random gcc cryptography x86-64

4
推荐指数
1
解决办法
372
查看次数

RDRAND和RDSEED内在函数GCC和英特尔C++

英特尔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)

如果支持这些内在函数,那么它们支持哪个版本(请使用编译时常量)?

c++ gcc icc intrinsics rdrand

3
推荐指数
2
解决办法
2653
查看次数

如何使用内联汇编与.Net使用英特尔的RDRAND

我正在使用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 ++代码结合起来?

c# assembly instruction-set rdrand

2
推荐指数
1
解决办法
949
查看次数