Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Intel DRNG只提供4字节的数据,而不是8字节的数据 我尝试在C++中实现._C++_Random_Intel - Fatal编程技术网

Intel DRNG只提供4字节的数据,而不是8字节的数据 我尝试在C++中实现.

Intel DRNG只提供4字节的数据,而不是8字节的数据 我尝试在C++中实现.,c++,random,intel,C++,Random,Intel,根据其生成64位无符号长代码的指南,代码应为: int rdrand64_step (unsigned long long *rand) { unsigned char ok; asm volatile ("rdrand %0; setc %1" : "=r" (*rand), "=qm" (ok)); return (int) ok; } 但是,此函数的输出rand仅提供32位的输出,如图所示 bd4a749d

根据其生成64位无符号长代码的指南,代码应为:

int rdrand64_step (unsigned long long *rand)
{
    unsigned char ok;
    asm volatile ("rdrand %0; setc %1"
                  : "=r" (*rand), "=qm" (ok));
    return (int) ok;
}
但是,此函数的输出
rand
仅提供32位的输出,如图所示

        bd4a749d
        d461c2a8
        8f666eee
        d1d5bcc4
        c6f4a412
为什么会这样

更多信息:我使用的IDE是代码块,而不是编写内联asm。你不需要它,有很多理由(包括这一个)来避免它:


在本例中,问题在于您可能正在编译32位代码,因此64位
rdrand
当然是不可编码的。但是您使用内联asm的方式最终为您提供了一个32位的rdrand,并存储了另一个寄存器中的高半衰期垃圾

gcc-Wall-O3-m32-march=ivybridge
(与叮当声类似)产生():

这避免了setcc然后测试它,这当然是多余的。gcc6具有从内联asm返回标志结果的语法。您还可以使用
asm goto
并在asm中放置jcc,跳转到
标签:return 1目标或下降到
返回0
。(内联asm文档有一个这样做的示例。另请参见。)

使用内嵌asm,clang(64位模式)将其编译为:

use_asm:
.LBB1_1:
    rdrand  rax
    setb    byte ptr [rsp - 1]
    cmp     byte ptr [rsp - 1], 0
    je      .LBB1_1
    ret
(对于包含内存的多个选项的约束,clang会做出错误的决策。)

实际上,gcc7.2和ICC17最终从asm获得的代码要比从内部获得的代码更好。他们使用
cmovc
得到0或1,然后
测试该值。这很愚蠢。但这是一个gcc/ICC遗漏的优化,有望实现。

使用from
immintrin.h
而不是编写内联asm。你不需要它,有很多理由(包括这一个)来避免它:


在本例中,问题在于您可能正在编译32位代码,因此64位
rdrand
当然是不可编码的。但是您使用内联asm的方式最终为您提供了一个32位的
rdrand
,并存储了另一个寄存器中的高半衰期垃圾

gcc-Wall-O3-m32-march=ivybridge
(与叮当声类似)产生():

这避免了setcc然后测试它,这当然是多余的。gcc6具有从内联asm返回标志结果的语法。您还可以使用
asm goto
并在asm中放置jcc,跳转到
标签:return 1目标或下降到
返回0
。(内联asm文档有一个这样做的示例。另请参见。)

使用内嵌asm,clang(64位模式)将其编译为:

use_asm:
.LBB1_1:
    rdrand  rax
    setb    byte ptr [rsp - 1]
    cmp     byte ptr [rsp - 1], 0
    je      .LBB1_1
    ret
(对于包含内存的多个选项的约束,clang会做出错误的决策。)


实际上,gcc7.2和ICC17最终从asm获得的代码要比从内部获得的代码更好。他们使用
cmovc
得到0或1,然后
测试该值。这很愚蠢。但是这是GCC/ICC的错误优化,希望是。在哪一个操作系统上,哪个版本的C++和哪个编译器?C++11有,更好地使用它(因为它是可移植的)。不是一个编译器(它可能运行一个),而是一个IDE我使用的编译器是codeblocks Code::Blocks是一个IDE。我假设编译器是mingw的某个版本。Linux具有
/dev/random
请参见,并且是(或包含)一个端口。在终端中运行
g++-v
g++--version
。最近的mingw应该提供一个C++11编译器,我相信这在32位代码中是行不通的。虽然我可能读错了文档,但是为什么需要实现一些DRNG呢?为什么不能使用
??请编辑您的问题进行解释!关于哪种操作系统和C++的哪个版本以及哪个编译器?C++11有,更好地使用它(因为它是可移植的)。不是一个编译器(它可能运行一个),而是一个IDE我使用的编译器是codeblocks Code::Blocks是一个IDE。我假设编译器是mingw的某个版本。Linux具有
/dev/random
请参见,并且是(或包含)一个端口。在终端中运行
g++-v
g++--version
。最近的mingw应该提供一个C++11编译器,我相信这在32位代码中是行不通的。虽然我可能读错了文档,但是为什么需要实现一些DRNG呢?为什么不能使用
??请编辑您的问题进行解释!是的,我似乎正在使用一个32位编译器,我试图用它来改变这种情况,但当我使用
cout@albusSimba测试运行它时:如果IDE的默认值是
-m32
,那么它必须通过
-m64
。IDK提供有关IDE的任何信息,但32位进程没有理由在运行64位可执行文件时遇到问题。它没有将编译器作为库加载(是吗?)是的,我已经通过了
-m64
,但它仍然没有通过
cout@albusSimba的简单测试:还通过了
-v
(verbose)来查看它是否在用户提供的选项之后附加了
-m32
。您还可以检查预处理器是否定义了
\uuuuux86\u64\uuuu
,以防它在64位模式下执行一些奇怪的操作,如32位指针(如。或者通过谷歌搜索更多关于使用IDE的信息。
内联调用always_inline'int\u rdrand64_步骤(长-长-无符号int*)失败
我切换到clion,我的代码似乎已经工作了,但我想知道为什么使用
immintrin.h
会将我抛出这个错误。这是我第一次看到这个错误。是的,我似乎在使用一个32位编译器,我试图使用它来更改它,但当我使用
cout@albusSimba测试运行它时:如果它是正确的,您的IDE必须通过
-m64
默认值为
-m32
。IDK提供有关IDE的任何信息,但32位进程没有理由在运行64位可执行文件时遇到问题。它没有将编译器作为库加载(是吗?)是的,我已经通过了
-m64
,但它仍然没有通过
的简单测试
use_asm:
.LBB1_1:
    rdrand  rax
    setb    byte ptr [rsp - 1]
    cmp     byte ptr [rsp - 1], 0
    je      .LBB1_1
    ret