4

我正在尝试分析 OpenMx 的功能,这是一个包含 C++ 和 Fortran 代码的 R 包,用于 CPU 时间。我的操作系统是 OS X 10.10。我已阅读R 手册中有关此主题的部分。本节和这篇文章引导我尝试 Instruments。这是我所做的

  1. 打开仪器
  2. 选择时间分析器模板
  3. 按下记录
  4. 使用 RStudio 启动我的 R 脚本

我得到以下输出:仪器输出. 命令行工具示例返回相同的输出。

问题是它看起来像是 omxunsafedgemm_直接从主线程调用的。但是,这是一个低级 Fortran 函数。它总是由一个名为 的 C++ 函数调用omxDGEMM。在这个例子omxDGEMM中,首先被调用omxCallRamExpection(所以几乎在调用树的底部)。的总时间omxDGEMM为 0。因此,分析信息当前是无用的。

在原始版本的包omxDGEMM中被定义为内联。我改变了这个,希望它能解决这个问题。此情况并非如此。omxunsafedgemmomxDGEMM这样称呼

F77_CALL(omxunsafedgemm)(&transa, &transb,
                        &(nrow), &(ncol), &(nmid),
                        &alpha, a->data, &(a->leading), 
                        b->data, &(b->leading),&beta, result->data, &(result->leading));

任何想法如何获得合理的分析器输出?

4

2 回答 2

2

此问题是由-O2gfortran 编译器的标志引起的,R 默认使用该标志。该-O2标志打开-O1标志启用的所有优化步骤以及更多(参见gcc 手册第98 页)。-O1标志启用的优化标志之一是-fomit-frame-pointer. Instruments 需要帧指针来了解调用帧的父级(请参阅此演讲)。

因此,改变

FFLAGS = -g -O2 $(LTO)

FFLAGS = -g -O2 -fno-omit-frame-pointer $(LTO)

${R_HOME}/etc/Makeconf解决问题。为了我R_HOME=/Library//Frameworks/R.framework/Versions/3.2/Resources

简单地省略-O2也可以解决问题,但会使 OpenMx 相当慢(在我的情况下为 200 秒对 30 秒)。

于 2015-09-11T15:49:23.330 回答
1

如果 OpenMx 二进制文件通过 getOpenMx.R 来自 OpenMx 网站,那么它将使用 gcc/gfortran 编译。如果它来自 CRAN,它将使用 OS X 编译器 LLVM 等进行编译(但它会缺乏并行计算,因为 OpenMP 与 LLVM 不兼容)。因此,您可以尝试使用其他二进制文件来查看用于分析的标签是否更好。请让我们知道您使用的是哪个版本以及更改版本是否有帮助。

于 2015-09-11T14:44:46.497 回答