首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lme()不同的结果分别运行在革命R (MKL应负责任?)

lme()不同的结果分别运行在革命R (MKL应负责任?)
EN

Stack Overflow用户
提问于 2013-12-18 17:16:58
回答 1查看 509关注 0票数 6

更新(2014年8月):我从来没有发现这件事的真相,也没有收到任何关于革命论坛的反馈。然而,这一问题似乎已在革命R 7.2中得到解决(R 3.0.3,也是学术版本)。我在几百次以下运行lme()测试,所有测试都产生了相同的结果,正如预期的那样。

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

代码语言:javascript
复制
library(nlme)
all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont))

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

代码语言:javascript
复制
> 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()输出:

代码语言:javascript
复制
> 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快(都运行单线程)。在其他工作中,革命的速度要快得多,这就是为什么我要研究它的原因。

EN

回答 1

Stack Overflow用户

发布于 2013-12-18 17:23:57

据猜测,Revo正在CPU核上并行化,而重组并行事物的算法并不总是相关的。换句话说,它取决于操作的顺序。如果线程以不同的顺序完成,如果核心必须做其他事情,则结果按不同的顺序加在一起,并且(a+b)+c并不总是等于浮点中的a+(b+c)。

要检查一下,有什么方法可以告诉Revo R只使用一个CPU内核吗?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20664377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档