我正在編寫一些R模擬代碼,但希望利用Fortran的swift線性代數庫來替換核心迭代循環。到目前爲止,我主要着眼於使用.Fortran調用鏈接的F95子例程的顯而易見的選項;我想我應該優化內存使用(我傳遞非常大的數組),然後設置DUP=FALSE
,但之後我在手冊中閱讀了關於此方法及其在R 3.1.0中的折舊和R 3.2.0中的禁用的危險的警告。現在手冊建議切換到.Call
,但該功能本身不提供Fortran支持。在R中有效調用F95:使用.Fortran還是.Call?
我的谷歌搜索已經產生a stackoverflow question其探索到C代碼鏈接的Fortran子程序並使用.Call
主叫它的一種方法。在我看來,這種事情可以像魅力或詛咒一樣工作。因此,我的問題:
- 瞄準速度和魯棒性,什麼是通過
.Fortran
,並通過.Call
調用Fortran的風險和收益? - 使用
.Call
來調用Fortran子例程有沒有更優雅/更高效的方法? - 是否還有其他選擇?
最常見* Fortran的快速線性代數庫*實際上是BLAS(或其派生之一)。 R不使用BLAS嗎? –
一個粗略的搜索,它似乎確實使用這些庫,據我所知(任何人都可以證明/證明這一點?),Fortran可以實現的速度仍然無法達到。我發現[這篇文章](http://blog.nguyenvq.com/blog/2014/11/10/optimized-r-and-python-standard-blas-vs-atlas-vs-openblas-vs-mkl/)使用不同的庫對R進行基準測試版本,似乎使用英特爾MKL的[RRO](http://projects.revolutionanalytics.com/rro/)是勝利者。但是,我希望這個代碼最終成爲一個包,所以我必須堅持使用未修改的上游文件R. – Ixxie
您鏈接的文章比較了BLAS的各種實現的性能。從Fortran與BLAS的各種實現的比較中可以得到非常類似的信息。結論會非常相似 - 在目前的架構上,英特爾的MKL可能是BLAS的最快實施。簡單地將Fortran放在R和慢BLAS之間不會改變任何事情。 –