Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
英特尔核心处理器(AVX,AES)上C语言的快速向量高斯正态随机数? P> 此问题是针对AVX/AVX2指令的C++代码,自2013以来在英特尔处理器中被发送(和/或AVX-512,自2015以来)。_C_Random_Intel - Fatal编程技术网

英特尔核心处理器(AVX,AES)上C语言的快速向量高斯正态随机数? P> 此问题是针对AVX/AVX2指令的C++代码,自2013以来在英特尔处理器中被发送(和/或AVX-512,自2015以来)。

英特尔核心处理器(AVX,AES)上C语言的快速向量高斯正态随机数? P> 此问题是针对AVX/AVX2指令的C++代码,自2013以来在英特尔处理器中被发送(和/或AVX-512,自2015以来)。,c,random,intel,C,Random,Intel,如何在具有新指令集的英特尔处理器上快速生成一百万个随机高斯单位法线 这个问题的更一般的版本以前被问过几次,例如,在。是的,我知道和添加以及其他技术。我试图建立我的逆正态分布,完全按照期望(伪正态,然后)采样(即映射),然后随机重新排列排序顺序 但是,我也知道我正在使用Intel Core处理器和最新的AVX矢量和AES指令集。此外,我需要C(不带C++的代码> STD< /COD>库),它需要在Linux和OSCX上使用GCC。 那么,有没有更好的特定于处理器的方法来快速生成这么多随机数?对于如

如何在具有新指令集的英特尔处理器上快速生成一百万个随机高斯单位法线

这个问题的更一般的版本以前被问过几次,例如,在。是的,我知道和添加以及其他技术。我试图建立我的逆正态分布,完全按照期望(伪正态,然后)采样(即映射),然后随机重新排列排序顺序

但是,我也知道我正在使用Intel Core处理器和最新的AVX矢量和AES指令集。此外,我需要C(不带C++的代码> STD< /COD>库),它需要在Linux和OSCX上使用GCC。
那么,有没有更好的特定于处理器的方法来快速生成这么多随机数?对于如此大量的随机数,英特尔处理器硬件是否提供了有用的指令?它们是一个值得研究的选项吗:如果是的话,是否有现有的标准函数实现?

您的CPU是否只支持AVX,还是支持FMA(融合乘法加法)的AVX2?您在使用Box Muller时遇到了哪些问题?生成的数字的数据类型是“float”还是“double”?@ivoWelch传统智慧认为Wallace和Zigurat在串行实现中工作得很好,但在矢量化方面却不是很好。“英特尔编译器”提供向量数学函数,但您打算使用gcc。我为
sincospif()
编写了C99代码,该代码使用AVX作为目标进行自动矢量化。由于需要
frexpf()
功能,无法使用自动矢量化
logf()
。问题似乎是AVX中缺少整数运算;它们在AVX2中,因此我的问题是您的机器是否有AVX2。当然,这不是一个无法克服的障碍,但需要比我愿意花费更多的时间来解决。使用100万个只有48位状态的简单PRNG实例,我可以在Xeon E3 1270 v2(IvyBridge)的一个核心上每秒生成558M单精度均匀分布随机数,使用英特尔编译器对循环进行矢量化。如果我加上Box-Muller变换,我可以生成284M单精度正态分布随机数。这方面的矢量化
sqrtf
logf
来自英特尔的VML,而
sincospif
实现是我自己的代码(<1.8 ulp错误)。因此,添加Box-Muller大约使统一PRNG的性能减半。对不起,错了。我之前使用的PRNG有96位状态。由于它大量使用移位,并且AVX没有移位指令,因此英特尔编译器在矢量化时将计算移到SSE寄存器(XMM)中。我用Marsaglia的KISS生成器替换了PRNG,该生成器每个实例有128位状态。我的CPU上正态分布随机“浮点”数的吞吐量与以前大致相同,为276M/秒。矢量化的明显方法是在
\uuuu m256
矢量的8个元素中并行运行8个独立的PRNG。然后你可以用纯垂直SIMD做任何你想做的事情,就像njuffa的评论所建议的那样。e、 g.对中的任何算法进行SIMD实现。(我同意这不完全是一个重复,但我认为答案是并行执行,向量元素之间没有交互。)您的CPU只支持AVX,还是支持FMA(融合乘加)的AVX2?您在使用Box Muller时遇到了哪些问题?生成的数字的数据类型是“float”还是“double”?@ivoWelch传统智慧认为Wallace和Zigurat在串行实现中工作得很好,但在矢量化方面却不是很好。“英特尔编译器”提供向量数学函数,但您打算使用gcc。我为
sincospif()
编写了C99代码,该代码使用AVX作为目标进行自动矢量化。由于需要
frexpf()
功能,无法使用自动矢量化
logf()
。问题似乎是AVX中缺少整数运算;它们在AVX2中,因此我的问题是您的机器是否有AVX2。当然,这不是一个无法克服的障碍,但需要比我愿意花费更多的时间来解决。使用100万个只有48位状态的简单PRNG实例,我可以在Xeon E3 1270 v2(IvyBridge)的一个核心上每秒生成558M单精度均匀分布随机数,使用英特尔编译器对循环进行矢量化。如果我加上Box-Muller变换,我可以生成284M单精度正态分布随机数。这方面的矢量化
sqrtf
logf
来自英特尔的VML,而
sincospif
实现是我自己的代码(<1.8 ulp错误)。因此,添加Box-Muller大约使统一PRNG的性能减半。对不起,错了。我之前使用的PRNG有96位状态。由于它大量使用移位,并且AVX没有移位指令,因此英特尔编译器在矢量化时将计算移到SSE寄存器(XMM)中。我用Marsaglia的KISS生成器替换了PRNG,该生成器每个实例有128位状态。我的CPU上正态分布随机“浮点”数的吞吐量与以前大致相同,为276M/秒。矢量化的明显方法是在
\uuuu m256
矢量的8个元素中并行运行8个独立的PRNG。然后你可以用纯垂直SIMD做任何你想做的事情,就像njuffa的评论所建议的那样。e、 g.对中的任何算法进行SIMD实现。(我同意这并不完全是一个重复,但我认为答案是在向量元素之间没有相互作用的情况下并行进行。)