c - 在 R : use . Fortran 或 .Call 中高效调用 F95?

标签 c r dll fortran

我正在编写一些 R 模拟代码,但想利用 Fortran 的快速线性代数库来替换核心迭代循环。到目前为止,我主要关注的是使用 .Fortran 调用链接的 F95 子程序的明显选择;我认为我应该优化内存使用(我正在传递非常大的数组)并设置 DUP=FALSE 但后来我在手册中阅读了关于这种方法的危险及其在 R 3.1.0 中的贬值的警告和 R 3.2.0 中的禁用。现在手册建议切换到 .Call,但此函数本身不提供 Fortran 支持。

我的谷歌搜索结果是 a stackoverflow question它探索了一种通过 C 代码 链接 Fortran 子例程并使用 .Call 调用它的方法。在我看来,这似乎是一种既可以像魅力也可以像诅咒一样起作用的东西。因此,我的问题:

  1. 以速度和健壮性为目标,通过 .Fortran 和通过 .Call 调用 Fortran 的风险和好处是什么?
  2. 是否有使用 .Call 调用 Fortran 子例程的更优雅/更有效的方法?
  3. 还有其他选择吗?

最佳答案

这是我对这种情况的看法:

.Call是通常首选的接口(interface)。它直接为您提供了一个指向底层 R 数据对象(SEXP)的指针,因此所有的内存管理都由您来决定。你可以尊重NAMED字段并根据需要复制数据,或者忽略它(如果您知道您不会就地修改数据,或者出于其他原因觉得这样做很舒服)

.Fortran尝试从 R SEXP 中自动提供适当的数据类型反对 Fortran 子程序;然而,通常不鼓励使用它(老实说,出于我不完全清楚的原因)

从 C/C++ 例程调用已编译的 Fortran 代码应该有一些运气。给定一个名为 fortran_subroutine 的 Fortran 子程序,您应该能够在 C/C++ 代码中提供前向声明,例如(注意:对于 C++ 代码,您需要一个前导 extern "C"):

void fortran_subroutine_(<args>);

请注意函数名称尾随的下划线——这就是 Fortran 编译器(我熟悉的,例如 gfortran)默认情况下 'mangle' 符号名称的方式,因此可用的符号将具有该尾随下划线。

此外,您需要确保 <args>您选择映射到从相应的 C 类型到相应的 Fortran 类型。还好,R-exts提供了这样一张表。

最后,R的R CMD build会自动促进 R 包的编译 + 链接过程。因为我显然是一个贪吃的惩罚,所以我 produced an example package它应该提供足够的信息让您了解绑定(bind)如何在那里工作。

关于c - 在 R : use . Fortran 或 .Call 中高效调用 F95?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646056/

相关文章:

java - 如何在 C# .NET Core 6 中使用 Java .dll?

c# - 从 C# 中的 Assembly.LoadFrom() 返回对象

java - 在静态初始化程序中使用 native 调用的 JNI RegisterNatives

c++ - 将 Matlab 变量传输到 C

用C转换子网掩码前缀

windows - 如何在 Windows 中执行 .r 文件

c - 将数据从 C 传递到 R

c - 为什么会出现segmentation Fault错误

日期和向量的 R 序列

php - THE 过程入口点 OCIstmtgetNextresult 无法位于动态链接库 oci.dll 中