更新(2014年8月):我从来没有深入了解这个问题,也从未在Revolution的论坛上得到任何反馈。但是,该问题似乎已在Revolution R 7.2(R 3.0.3,又是学术版本)中得到修复。我将lme()测试运行了数百次,所有测试均产生了预期的结果。[更新结束]
我刚刚在新PC上安装了Revolution 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产生相同的结果。
Revolution 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的问题。)
似乎其他人正在获取inconsistent results with MKL as well。机器收费之间存在差异,即
all.equal()
为TRUE,而identical()
为FALSE。就我而言,不同的结果似乎非常大。我已经在Revolution R的论坛上发布了此问题,如果得到回应,将在这里进行更新。我想在这一点上,我的问题应修改为“何时使用MKL BLAS,何时使用CRAN-R BLAS”。这不是速度(*)的问题,而是一致和正确结果的问题。我将花费更多时间寻找标准测试套件(此处不确定术语吗?),以将R的输出与已知正确的输出进行比较。这是我喜欢
data.table
的事情之一,它具有自己的测试对最终用户可见。我知道,我不应该期望包含所有(或什至大多数)软件包的单个测试,而是至少涵盖基本功能的测试。(*)速度取决于具体的工作流程。在这种特殊情况下,CRAN BLAS比MKL(都运行单线程)要快。在其他工作中,Revolution R的速度要快得多,这就是我要研究它的原因。
最佳答案
猜测,Revo R正在通过CPU内核对其进行并行化,并且重组并行事物的算法并不总是关联的。换句话说,它取决于操作顺序。如果线程以不同的顺序完成(如果核心必须做其他事情,则可能发生),那么结果将以不同的顺序累加,并且(a + b)+ c并不总是等于 float 中的a +(b + c)观点...
要进行检查,是否可以通过某种方式告诉Revo R仅使用一个CPU内核?
关于r - lme()不同的结果各自在Revolution R下运行(应归咎于MKL吗?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20664377/