Intel DRNG只提供4字节的数据,而不是8字节的数据 我尝试在C++中实现.
根据其生成64位无符号长代码的指南,代码应为: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
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遗漏的优化,有望实现。使用fromimmintrin.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