C++ 特定C+的性能下降+;随机数生成

C++ 特定C+的性能下降+;随机数生成,c++,random,clang,mersenne-twister,C++,Random,Clang,Mersenne Twister,使用C++11的随机模块,我在使用std::mt19937(32位和64位版本)和统一实分布(浮点或双精度,无所谓)时遇到了奇怪的性能下降。与g++编译相比,它要慢一个数量级以上 罪魁祸首不仅仅是机器翻译生成器,因为它速度快,具有统一的内部分布。而且这并不是统一实分布中的一个普遍缺陷,因为对于其他生成器,如默认随机引擎,它的速度很快。只是这种特殊的组合速度慢得出奇 我对本质不太熟悉,但Mersenne Twister算法或多或少都有严格的定义,所以实现上的差异不能解释这种差异,我想是吧?下面是我

使用C++11的随机模块,我在使用
std::mt19937
(32位和64位版本)和
统一实分布(浮点或双精度,无所谓)时遇到了奇怪的性能下降。与g++编译相比,它要慢一个数量级以上

罪魁祸首不仅仅是机器翻译生成器,因为它速度快,具有
统一的内部分布
。而且这并不是
统一实分布中的一个普遍缺陷,因为对于其他生成器,如
默认随机引擎
,它的速度很快。只是这种特殊的组合速度慢得出奇

我对本质不太熟悉,但Mersenne Twister算法或多或少都有严格的定义,所以实现上的差异不能解释这种差异,我想是吧?下面是我在64位linux机器上对clang 3.4和gcc 4.8.1的测试结果:

gcc 4.8.1
runtime_int_default: 185.6
runtime_int_mt: 179.198
runtime_int_mt_64: 175.195
runtime_float_default: 45.375
runtime_float_mt: 58.144
runtime_float_mt_64: 94.188

clang 3.4
runtime_int_default: 215.096
runtime_int_mt: 201.064
runtime_int_mt_64: 199.836
runtime_float_default: 55.143
runtime_float_mt: 744.072  <--- this and
runtime_float_mt_64: 783.293 <- this is slow
gcc 4.8.1
运行时默认值:185.6
运行时间:179.198
运行时间(MTU)64:175.195
运行时\u浮点\u默认值:45.375
运行时浮动时间:58.144
运行时\u浮点\u mt\u 64:94.188
叮当声3.4
运行时默认值:215.096
运行时间\u int\u mt:201.064
运行时间\u int\u mt\u 64:199.836
运行时\u浮点\u默认值:55.143
运行时浮点值:744.072向量(n,0);
自动t1=std::chrono::高分辨率时钟::现在();
对于(int i=0;istd::cout如评论中所述,问题是由于gcc内联比clang更具攻击性。如果我们使clang内联非常具有攻击性,则效果消失:

使用
g++-O3
编译代码会产生

runtime_int_default: 3000.32
runtime_int_mt: 3112.11
runtime_int_mt_64: 3069.48
runtime_float_default: 859.14
runtime_float_mt: 1027.05
runtime_float_mt_64: 1777.48
runtime_int_default: 3623.89
runtime_int_mt: 751.484
runtime_int_mt_64: 751.132
runtime_float_default: 1072.53
runtime_float_mt: 968.967
runtime_float_mt_64: 1781.34
clang++-O3-mllvm-inline threshold=10000

runtime_int_default: 3000.32
runtime_int_mt: 3112.11
runtime_int_mt_64: 3069.48
runtime_float_default: 859.14
runtime_float_mt: 1027.05
runtime_float_mt_64: 1777.48
runtime_int_default: 3623.89
runtime_int_mt: 751.484
runtime_int_mt_64: 751.132
runtime_float_default: 1072.53
runtime_float_mt: 968.967
runtime_float_mt_64: 1781.34

显然,在
int\u mt
的情况下,clang现在输出内联gcc,但所有其他运行时现在都处于相同的数量级。我在Fedora 20 64位上使用了gcc 4.8.3和clang 3.4。

也许你想稍微分析一下(例如,使用callgrind)并比较生成的汇编程序…我只能为
float\u mt
情况复制这一点,而不能为
float\u mt\u 64
情况复制。我在Fedora 20 64位上使用了你的代码和clang3.4。我想说发布一个错误报告,但我看到你已经这样做了,@Basti:你知道两者都使用libstdc++还是Clang使用libc++?标准库imp的更改当然,实现将产生巨大的影响。作为另一个比较点,您可能希望尝试提高Clang的内联级别,看看会发生什么情况
-mllvm-inline treshold=10000
(例如),因为我似乎记得Clang默认情况下的内联treshold低于gcc,这可能会影响进一步的优化(值得注意的是,持续传播)。我不知道libs。但是内联修复了它!哇,谢谢