混合了R、C++和Fortran的Intruments Call Tree出现故障

4
我正在尝试对OpenMx的一个函数进行CPU时间分析,该R包含有C++和Fortran代码。我的操作系统是OS X 10.10。我已经阅读了R手册中关于这个主题的部分以及这篇文章,它们都引导我尝试使用Instruments。以下是我所做的:
  1. 打开Instruments
  2. 选择时间分析模板
  3. 点击记录按钮
  4. 使用RStudio启动我的R脚本
我得到了以下输出:Instruments Output。命令行工具sample返回相同的输出。
问题在于看起来omxunsafedgemm_将直接从主线程调用。然而,这是一个低级Fortran函数。它总是被一个名为omxDGEMM的C++函数调用。在这个例子中,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));

有没有想法如何获得一个合理的分析器输出?

没有人有任何想法吗? - Julian Karch
你用哪个编译器来编译 C 代码,哪个编译器来编译 Fortran 代码呢?我完全不知道,但是也许仪器相关的代码只能使用 LLVM 编译器正常运行,而你的 Fortran 代码则是使用 gfortran 或类似编译器编译的吗? - haraldkl
2个回答

2
这个问题是由于gfortran编译器的-O2标志引起的,R默认使用它。 -O2标志开启了所有-O1标志启用的优化步骤,并增加了更多优化(参见gcc手册页第98页)。其中-O1标志启用的优化标志之一是-fomit-frame-pointer。Instruments需要框架指针来知道调用帧的父级(请参见此视频)。
因此,在${R_HOME}/etc/Makeconf中将 FFLAGS = -g -O2 $(LTO) 更改为 FFLAGS = -g -O2 -fno-omit-frame-pointer $(LTO)

可以解决这个问题。对我而言R_HOME=/Library//Frameworks/R.framework/Versions/3.2/Resources
简单地省略-O2也可以解决问题,但会使OpenMx变得明显较慢(在我的情况下从30秒变成200秒)。

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

1
我使用了来自Github的OpenMx版本。作为Fortran编译器,我使用了gfortran-4.8。作为C++编译器,我使用了gcc。我认为我正在寻找一个解决方案的过程中。我会尽快回答。 - Julian Karch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接