Parallelverarbeitung in R begrenzt

8

Ich führe ubuntu 12.04 und R 2.15.1 mit den Paketen parallel und doParallel aus. wenn ich etwas parallel laufe, bin ich auf 100% eines Kerns beschränkt, wenn ich bis zu 800% habe, da ich es mit 8 Kernen betreibe. Auf dem Systemmonitor wird angezeigt, dass jeder untergeordnete Prozess nur 12% erhält.

Was schränkt meine Ausführungsgeschwindigkeit ein?

    
Andrew Redd 16.10.2012, 22:56
quelle

3 Antworten

10

Das Problem liegt möglicherweise darin, dass der R-Prozess auf einen Kern beschränkt ist (und die Unterprozesse diesen erben).

Versuchen Sie Folgendes:

%Vor%

Wenn nun auf Ihrer Maschine die aktuelle Affinitätsmaske eine 1 meldet, dann war das das Problem. Die obige Zeile sollte es lösen (d. H. Die zweite Zeile sollte fff (oder ähnlich) melden.

Simon Urbanek hat eine Funktion mcaffinity geschrieben, die dieses Steuerelement für Multicore zulässt. Soweit ich weiß, ist es immer noch in R-devel.

Für Einzelheiten siehe z. diese Diskussion über R-sig-hpc .

Update und Ergänzung zu Xin Guos Antwort:

Wenn Sie implizite Parallelisierung über openblas und explizite Parallelisierung (über parallel / snow / multicore) zusammen verwenden, möchten Sie vielleicht die Anzahl der Threads ändern, die openblas verwendet, abhängig davon, ob Sie sich in einem explizit parallelen Teil befinden oder nicht > Das ist möglich (bei openblas unter Linux kenne ich kein anderes der üblichen optimierten BLAS ', das eine Funktion für die Anzahl der Threads bietet), siehe Simon Fullers Blogpost für Details.

    
cbeleites 17.10.2012 00:15
quelle
5

Ich habe das gleiche Problem wegen der libblas.so(.3gf) -Pakete festgestellt, und ich weiß nicht, ob dies auch Ihr Problem verursacht. Wenn R startet, ruft es ein BLAS -System auf, das in Ihrem System installiert ist, um lineare algebraische Berechnungen durchzuführen. Ich habe libopenblas.so(.3gf) und es ist hoch optimiert mit der Option "CPU Affinität", das heißt, wenn Sie numerische Vektor-oder Matrix-Berechnung, das openblas-Paket wird nur 8 Threads machen und jeder der Threads zu einem fest spezifizierte und feste CPU, um die Codes zu beschleunigen. Wenn Sie dies einstellen, wird Ihrem System jedoch mitgeteilt, dass alle CPUs sehr ausgelastet sind, und wenn also weitere parallele Tasks kommen, wird das System versuchen, sie in eine CPU zu pressen, um die ausgelasteten CPUs nicht zu stören / p>

Also das war meine Lösung, die funktionierte: Ich habe eine openblas-Paketquelle heruntergeladen und mit der Datei " Makefile.rule " geändert: es gibt eine Zeile " #NO_AFFINITY = 1 " und ich habe gerade " # " gelöscht, so dass Nach dem Kompilieren ist keine Affinitätsoption ausgewählt. Dann habe ich das Paket installiert und das Problem wurde gelöst.

Als Referenz finden Sie Ссылка

Bitte beachten Sie, dass dies ein Kompromiss ist. Durch das Entfernen der CPU-Affinität verlieren Sie an Effizienz, wenn Sie numerische Berechnungen durchführen. Aus diesem Grund veröffentlicht der Openblas-Betreuer (Dr. Xianyi Zhang) das Problem, veröffentlicht jedoch weiterhin die Codes mit der CPU-Affinität als Standardoption.

    
Xin Guo 17.10.2012 00:15
quelle
0

Ich vermute, dass Sie wahrscheinlich den falschen Code hatten. Ich möchte ein Beispiel aus dem Internet kopieren Ссылка :

%Vor%

und Sie können definieren, wie viele Kerne Sie in der parallelen verwenden möchten:

%Vor%     
liuminzhao 17.10.2012 00:15
quelle

Tags und Links