Warum ist eine selbstgeschriebene Rcpp-vektorisierte mathematische Funktion schneller als ihr Basis-Gegenstück?

8

OK, ich kenne die Antwort, aber wenn ich mich von dieser Frage inspirieren lasse, würde ich gerne ein paar nette Meinungen dazu bekommen folgend: Warum die Rcpp Übung unten ist 15% schneller (für lange Vektoren) als die eingebaute exp() ? Wir alle wissen, dass Rcpp ein Wrapper für die R / C-API ist, so dass wir eine etwas schlechtere Performance erwarten sollten.

%Vor%     
gagolews 17.10.2014, 18:21
quelle

2 Antworten

8

Base R tendiert dazu, mehr nach NA zu suchen, damit wir etwas gewinnen können, wenn wir das nicht tun. Beachten Sie auch, dass wir mit Tricks wie Loop Unrolling (wie in Rcpp Sugar) noch etwas besser machen können.

Also habe ich

hinzugefügt %Vor%

und damit bekomme ich einen weiteren Gewinn - mit weniger Code auf der Benutzerseite:

%Vor%     
Dirk Eddelbuettel 17.10.2014, 18:55
quelle
5

Wenn Sie wirklich Leistungsverbesserungen erzielen möchten, muss Code geschrieben werden, um die zugrunde liegende Hardware-Parallelität zu nutzen. Sie können dies mit dem Paket RcppParallel tun und sein parallelFor wäre dafür ein ideales Gefäß.

Sie können auch eine modernere Implementierung von R/C++ ausprobieren. Die nächste Version von Rcpp11 , die in ein paar Tagen veröffentlicht wird, wird automatisch mit einem Thread mit Zucker ausgeliefert, was die expSugar von der vorherigen Antwort besser macht.

Überlegen Sie:

%Vor%

Mit Rcpp bekomme ich:

%Vor%

Eine nette, aber etwas anekdotische Verbesserung, die sich durch verschiedene Inlining, etc ... erklären lässt, wie in anderen Antworten und Kommentaren beschrieben.

Mit Rcpp11 und automatischem Zucker mit Zucker, bekomme ich:

%Vor%     
Romain Francois 21.10.2014 19:36
quelle

Tags und Links