R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

2024-05-14

我有一个 R 包,它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环(很大程度上依赖于 BLAS 和 LAPACK 例程)。作为 Fortran 的接口,我使用.Fortran功能。我刚刚读过乔纳森卡拉汉的博客文章 http://mazamascience.com/WorkingWithData/?p=1099关于使用.Call代替.C如果子例程是用 C/C++ 编写的,这让我想到使用它会更好吗.Call使用 Fortran 子例程时是否也可以通过用 C 语言编写一个简单的包装器来调用 Fortran 子例程来实现接口?

如前所述,从某种意义上说,我的 Fortran 代码非常简单,我只是使用 double 或 integer 类型的多维数组。但我了解到,我必须在 R 端编写大量检查,以确保一切不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或更改某些矩阵的维度等。

子程序写为F90/95。


如果您正在处理大型数据集,这可能会有优势。 .Call 可以更快,因为每次调用该函数时不必复制数据。对于这个问题中描述的情况,不会有这样的优势,因为 R 2.15.1 发行说明指出

.C() 和 .Fortran() 执行较少的复制:原始、逻辑、整数、实数或复数向量且未命名的参数在调用前不会复制,并且(命名或未命名)在调用后不会复制。不再复制列表(它们应该在 C 代码中以只读方式使用)。

切换到 .Call 意味着您放弃 .Fortran 接口的便利。您将 SEXP 传递到 C 代码中,使用(可怕且没有详细记录的)R API 对数据进行任何检查/操作,然后从 C 调用 Fortran 函数。任何使用您的代码的其他人都必须理解R API 和 C/Fortran 互操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点? 的相关文章

随机推荐