【问题标题】:Rcpp: Platform differences in outputRcpp:输出的平台差异
【发布时间】:2015-09-04 05:34:37
【问题描述】:

我有以下问题(并且不能真正产生最小的测试)-- 我正在通过 Rcpp 将一个包从 C++ 移植到 R。 测试(我正在测试输出矩阵是否正是我 如果直接调用c++会得到)在linux和osx下绝对相等,没有区别。

但是当通过 build_win() 或 win 8.1 虚拟机进行测试时,我得到不同的结果(但两者之间的结果是一致的,所以我有 linux/osx vs win 结果) 我已经用相应的 Rcpp 糖替换了一个 rand() 调用,所以这应该没问题(至少我希望如此)。 由于通过“R -d valgrind”调用测试也不会产生错误,我有点困惑如何继续。 所有测试均使用 R 3.2.0(本地机器)和最新的不稳定版本(通过 build_win())完成 所以我的问题是:

  • 编译时是否存在任何已知的 Rcpp 差异(例如,Windows 上 Rtools 提供的编译器太旧,因此数值计算(使用 STL,没有其他库,如 boost/eigen 等)预计会略有不同?
  • 有没有调试问题的好方法?我基本上需要逐行跟踪 C++ 代码,我什至不知道如何做到这一点,除了沉重的 std::couts。

谢谢。

【问题讨论】:

  • 我只是意识到 build_win() 的 i386/x64 结果是不同的,因此可能暗示代码中存在 32/64 位问题。会尝试谷歌,我可能做错了什么。
  • 好吧,这是一个 32 位与 64 位的问题,因为 32 位的 ubuntu 15.04 确实产生了与我的 64 位的 ubuntu 15.04 不同的结果。
  • 现在变得更加奇怪了:如果我直接通过命令行运行脚本 (R --vanilla 正确 结果。 valgrind 是否修复了一些 R 错误? ://

标签: linux windows macos cross-platform rcpp


【解决方案1】:

关于 32bit/64bit 问题的真相确实写在这里 different behaviour or sqrt when compiled with 64 or 32 bits

添加 -ffloat-store 选项确实解决了我的问题。 没想到,以为问题出在源代码上。

【讨论】:

  • 嘿,我也有同样的问题。我在哪里指定-ffloat-store?我只是将其添加到我的 .cpp 文件中吗?我必须以某种方式告诉编译器 -ffloat-store 吗?谢谢
  • 您将其添加到 src 目录中的 Makevars 文件中,如下所示:PKG_CXXFLAGS= -ffloat-store (所以整个文件就是那一行,以防您还没有这个)。请注意,这并没有解决我的问题。不知何故,代码中存在上溢/下溢(我相信),这似乎在每个平台上都会以不同的方式处理。最后,我只是将该代码部分中的浮点数硬舍入为 14 位,这样我可以确保每个平台的计算都相同。
  • 为我工作,谢谢@complexM。我在 64 位 Windows 笔记本电脑上有 Rcpp 代码。我正在对 25000 个点进行成对求和,因此 ~25000^2 计算并存储在 double vars 中。笔记本电脑的结果是 7.04,但 HPC Linux 集群是 7.59!如果这不起作用,我唯一的其他解决方案就是在我的 .cpp 代码中将 double 更改为 long double
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2020-03-17
  • 2015-06-28
  • 2023-01-21
  • 2013-12-18
相关资源
最近更新 更多