2013-03-01 10 views
16

Ich habe ein R-Paket, das viele Fortran-Subroutinen für verschachtelte Schleifen rekursiver linearer Algebra-Berechnungen verwendet (stark abhängig von BLAS- und LAPACK-Routinen). Als Schnittstelle zu Fortran verwende ich .Fortran Funktion. Ich lese gerade Jonathan Callahan's blog post über anstelle von .C im Falle von Unterprogrammen in C/C++ geschrieben, und es hat mich denken, dass es besser wäre, .Call Schnittstelle auch bei der Verwendung Fortran Subroutinen zu verwenden, indem Sie einen einfachen Wrapper in C schreiben, die dann anruft die Fortran Subroutinen?R: Vorteile der Verwendung einer Fortran-Subroutine mit .Call und C/C++ - Wrapper anstelle von .Fortran?

Wie gesagt, meine Fortran-Codes sind ziemlich einfach in einem Sinne, dass ich nur mit mehrdimensionalen Arrays vom Typ Double oder Integer spiele. Aber ich habe gelernt, dass ich eine Menge Überprüfungen in R-Seite schreiben muss, um sicherzustellen, dass alles nicht abstürzt, weil ich versehentlich den Speichermodus einer Matrix in eine ganze Zahl änderte oder die Abmessungen einer Matrix geändert wurden usw.

Unterprogramme werden als F90/95 geschrieben.

+1

scheint vernünftig zu sein. Call() mit einigen C-Funktion, und Sie können dann tatsächlich Ihre Fortran Subroutinen aus dem C-Code aufrufen, die relativ einfach ist (oder sogar alles in C tun, wenn Sie Fortran wirklich nicht benötigen). – steabert

+0

Ja, aber welche Vorteile bringt das, wenn überhaupt? Ich könnte komplett zu C wechseln, aber das wäre zu umständlich und ich bezweifle, dass es nützlich wäre, da ich dann Fortran BLAS-Funktionen von C sowieso aufrufen würde. –

+0

Könnte relevant sein: http://www.ualberta.ca/AICT/RESEARCH/LinuxClusters/doc/ifc91/main_for/mergedProjects/bldaps_for/pgsclmix.htm – KLDavenport

Antwort

3

Es kann von Vorteil sein, wenn Sie mit einem großen Datensatz arbeiten. .Call kann viel schneller sein, da Sie die Daten nicht jedes Mal kopieren, wenn Sie die Funktion aufrufen. Für den Fall, in dieser Frage beschrieben, wird es kein solcher Vorteil sein, weil die R 2.15.1 Release Staatsbons

.C() und .Fortran() tut weniger Kopieren: Argumente, die roh, logisch sind, Ganzzahlige, reelle oder komplexe Vektoren, die unbenannt sind, werden vor dem Aufruf nicht kopiert und (benannt oder nicht) werden nach dem Aufruf nicht kopiert. Listen werden nicht mehr kopiert (sie sollen im C-Code schreibgeschützt verwendet werden).

Der Wechsel zu .Call bedeutet, dass Sie den Komfort der .Fortran-Schnittstelle aufgeben. Sie würden SEXPs in den C-Code eingeben, jede Überprüfung/Manipulation der Daten mit der (beängstigenden und nicht gut dokumentierten) R-API durchführen und dann eine Fortran-Funktion von C aufrufen. Jeder, der mit Ihrem Code arbeitet, muss das verstehen die R API und C/Fortran Interop.

+0

Ja, das Kopieren scheint ein klarer Vorteil zu sein, obwohl ab R 2.15.1 der Unterschied leicht reduziert ist: ".C()' und '.Fortran()' machen weniger Kopieren: Argumente, die rohe, logische, ganze Zahlen sind reelle oder komplexe Vektoren werden unbenannt vor dem Aufruf nicht kopiert und (benannt oder nicht) werden nach dem Aufruf nicht kopiert. " (Von R Nachrichten). –

+0

Es sieht aus wie in meiner Anwendung die Auswirkungen des Kopierens sind nicht signifikant; Ich testete meinen Code mit '.Fortran' unter Verwendung von' DUP = FALSE' und 'DUP = TRUE' und sah praktisch keine Unterschiede, obwohl ich Arrays mit Millionen von Elementen verwendete. –

+0

Ich war mir der Änderung im Verhalten dieser Funktionen nicht bewusst. Ich habe die Frage bearbeitet, um sie zu reflektieren. – user2225804