更新(2014年8月):我从来没有发现这件事的真相,也没有收到任何关于革命论坛的反馈。然而,这一问题似乎已在革命R 7.2中得到解决(R 3.0.3,也是学术版本)。我在几百次以下运行lme()测试,所有测试都产生了相同的结果,正如预期的那样。
我刚刚在一台新的PC上安装了革命R7.0(R3.0.2)的学术版本,下面的代码得到了奇怪的结果。每次代码运行时,都会给出不同的结果。在CRAN下,结果总是一样的(我认为应该是这样)。代码片段来自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文件是位对位相同的)。
我还没有足够的知识去到引擎盖底下去。如有任何建议或想法,将不胜感激。我也在革命的论坛上发过帖子,但这里的人口似乎比这里少得多.
这是64位Windows8.1,64位R以及英特尔i7-4770 CPU,如果它是重要的.当前版本的革命R(R3.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:我已经跟踪了这个问题(按照下面的答案和注释中的一些提示),因为革命R使用了Intel库。如果我切换到CRAN提供的BLAS库,问题就会消失。(注意:我不知道如何自己编译R,所以我还没有测试过OpenBLAS和其他替代品。在R革命中,这只是一个重命名两个dll-s的问题。
似乎其他人都得到了inconsistent results with MKL as well。机器收费的不同之处在于,all.equal()为真,而identical()为假。在我的例子中,不同的结果似乎意义重大。
我已经在革命R的论坛上发布了这个问题,如果我得到回应,我会在这里更新。我认为在这一点上,我的问题应该修改为“何时使用MKL和何时CRAN”。这不是速度问题,而是一致和正确的结果问题。我将花更多的时间寻找一个标准的测试套件(这里不确定术语吗?)检查R的输出与已知的正确输出。这是我最喜欢data.table的地方之一,它有自己的测试,对最终用户是可见的。我知道,我不应该期望一个包含所有(甚至大多数)包的测试,而是至少涵盖基本功能的一些内容。
(*)速度取决于具体工作流程。在这种情况下,CRAN BLAS比MKL快(都运行单线程)。在其他工作中,革命的速度要快得多,这就是为什么我要研究它的原因。
发布于 2013-12-18 17:23:57
据猜测,Revo正在CPU核上并行化,而重组并行事物的算法并不总是相关的。换句话说,它取决于操作的顺序。如果线程以不同的顺序完成,如果核心必须做其他事情,则结果按不同的顺序加在一起,并且(a+b)+c并不总是等于浮点中的a+(b+c)。
要检查一下,有什么方法可以告诉Revo R只使用一个CPU内核吗?
https://stackoverflow.com/questions/20664377
复制相似问题