6

更新(2014 年 8 月):我从未深究此事,也从未在 Revolution 论坛上得到任何反馈。然而,这个问题似乎已在 Revolution R 7.2 中得到解决(使用 R 3.0.3,同样是学术版本)。我运行了几百次以下的 lme() 测试,所有结果都和预期的一样。[更新结束]

我刚刚在一台新 PC 上安装了革命 R 7.0 (R 3.0.2) 的学术版,下面的代码得到了奇怪的结果。每次运行代码时,它都会给出不同的结果。在 CRAN-R 下,结果总是相同的(我认为应该如此)。代码片段来自test.data.table()版本 1.8.10 的测试 527,它指出了错误。

library(nlme)
all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont))

我得到类似下面的东西,但每次都不一样。

> all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont))
[1] "Component 4: Component 2: Component 1: Mean relative difference: 1.774149e-08"
[2] "Component 7: Mean relative difference: 0.0003335902"

'有趣'的事情是nlme包(其中lme()的一部分)本身是相同的,我卸载并重新安装以确保(包的 nlme_3.1-113.zip 文件是逐位相同的)。

我还不够了解,无法深入了解。任何指针或想法将不胜感激。我也在Revolutions的论坛上发过帖子,但这里的人似乎比这里少得多……

这是在 64 位 Windows 8.1、64 位 R 以及 Intel i7-4770 CPU 下(如果重要)。当前版本的 Revolution R (R 3.0.2) 和之前的 (2.15.3) 都会产生意想不到的(对我而言)行为。CRAN-R 3.0.1 和 3.0.2 产生相同的结果。

革命 R 的 sessionInfo() 输出:

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] nlme_3.1-113     Revobase_7.0.0   RevoMods_7.0.0   RevoScaleR_7.0.0
[5] lattice_0.20-24  rpart_4.1-3     

loaded via a namespace (and not attached):
[1] codetools_0.2-8   foreach_1.4.1     grid_3.0.2        iterators_1.0.6  
[5] pkgXMLBuilder_1.0 revoIpe_1.0       tools_3.0.2       XML_3.98-1.1   

更新 1: 我已经将问题(遵循下面的答案和评论中的一些指针)追溯到 Revolution R 使用英特尔 MKL BLAS 库的事实。如果我切换到 CRAN 提供的 BLAS 库,问题就会消失。(注意:我对自己编译 R 的了解不够,所以我没有测试过 OpenBLAS 和其他替代方案。在 Revolution R 中,只需重命名两个 dll-s。)。

似乎其他人也得到了与 MKL 不一致的结果。机器公差内存在差异,即为all.equal()TRUE 而identical()为 FALSE。在我的案例中,不同的结果似乎非常大。

我已经在 Revolution R 的论坛上发布了这个问题,如果我得到回复,我会在这里更新。我想此时我的问题应该修改为“何时使用 MKL BLAS 以及何时使用 CRAN-R BLAS”。这不是速度(*)的问题,而是一致和正确的结果。我将花更多时间寻找标准测试套件(不确定此处的术语?)以检查 R 的输出与已知正确的输出。这是我喜欢的事情之一data.table,它有自己的测试对最终用户可见。我知道我不应该期望包含所有(甚至大多数)包的单个测试,但至少涵盖基本功能的东西。

(*) 速度取决于具体的工作流程。在这种特殊情况下,CRAN BLAS 比 MKL 快(都运行单线程)。在其他工作中,Revolution R 的速度要快得多,这就是我研究它的原因。

4

1 回答 1

4

猜测一下,Revo R 是在 CPU 内核上并行化它,而重新组合并行事物的算法并不总是关联的。换句话说,它取决于操作的顺序。如果线程以不同的顺序完成,如果内核必须执行其他操作,则结果会以不同的顺序相加,并且 (a+b)+c 在浮动时并不总是等于 a+(b+c)观点...

检查一下,有没有办法告诉 Revo R 只使用一个 CPU 内核?

于 2013-12-18T17:23:57.530 回答