Multithreading 具有多线程的rdseed指令

Multithreading 具有多线程的rdseed指令,multithreading,random,x86,openmp,rdrand,Multithreading,Random,X86,Openmp,Rdrand,我想使用带有多核的rdseed指令为定制PRNG生成种子 以下是我到目前为止使用OpenMP的情况 //gcc -Wall -O3 -fopenmp -mrdseed myrand.c #include <x86intrin.h> #include <stdio.h> int main(void) { #pragma omp parallel { unsigned r; #pragma omp critical

我想使用带有多核的
rdseed
指令为定制PRNG生成种子

以下是我到目前为止使用OpenMP的情况

//gcc -Wall -O3 -fopenmp -mrdseed myrand.c
#include <x86intrin.h>
#include <stdio.h>
int main(void)  {  
    #pragma omp parallel
    {
        unsigned r;
        #pragma omp critical
        while(!_rdseed32_step(&r));
        //prng_init(r);
        printf("%d\n", r);
    }
}

对我来说似乎是正确的方法。

它会起作用的。在RNG在运行这段代码的过程中发生的不太可能发生的事件中,它会被锁定在一个紧密的循环中,但是在现实的场景中,它会给你一个随机数,所有的都会很好。
_rdseed16_step()、_rdseed32_step()和_rdseed64_step()遵循RdSeed指令的语义,即返回CF中的成功位和目标寄存器中的随机数。因此,它可以在循环中运行,以获得所需的任意多个随机位。

硬件已经有了缓冲区和耗尽重试机制;执行自己的软件锁定只是为了最小化重试的可能性,这似乎是毫无意义的额外开销。
#pragma omp critical
while(!_rdseed32_step(&r));