【发布时间】:2013-02-16 09:52:56
【问题描述】:
我有一个 R 包,它使用大量 Fortran 子例程进行递归线性代数计算的嵌套循环(很大程度上取决于 BLAS 和 LAPACK 例程)。作为 Fortran 的接口,我使用 .Fortran 函数。我刚刚读到Jonathan Callahan's blog post 关于使用.Call 而不是.C 在用C/C++ 编写的子例程的情况下,这让我想到在使用Fortran 子例程时也使用.Call 接口会更好,通过编写C 中的一个简单包装器,然后调用 Fortran 子例程?
如前所述,我的 Fortran 代码在某种意义上非常简单,我只是使用双精度或整数类型的多维数组。但是我了解到我必须在 R 端写很多检查以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等。
子程序写成 F90/95。
【问题讨论】:
-
似乎合理地将 .Call() 与某些 C 函数一起使用,然后您确实可以从 C 代码中调用您的 Fortran 子例程,这相对容易(如果您不这样做,甚至可以在 C 中执行所有操作真的需要 Fortran)。
-
是的,但是如果有的话会带来什么样的好处呢?我可以完全切换到 C,但这太麻烦了,我怀疑它是否有用,因为无论如何我都会从 C 调用 Fortran BLAS 函数。
-
你为什么要切换到这里?然后,您将拥有另一层抽象。调用 C 例程又调用 FORTRAN 永远不会比你拥有的更快,R -> FORTRAN。
-
我认为没有那么简单,根据我的问题和其他来源的链接,我的理解是
.C和.Fortran的开销比.Call的开销要大得多至少因为参数的额外复制。与 R 等相比,C 中的类型检查可能存在一些性能差异,对此也不知道。
标签: c performance r fortran wrapper