Verwenden Sie Multi-Processing / Threading, um die numpy Array-Operation in Chunks zu unterteilen

8

Ich habe eine Funktion definiert, die ein MxN-Array rendert. Das Array ist sehr groß, daher möchte ich die Funktion verwenden, um kleine Arrays (M1xN, M2xN, M3xN --- MixN. M1 + M2 + M3 + --- + Mi = M) gleichzeitig mit Multi-Processing / Threading zu erzeugen und schließlich zu verbinden Diese Arrays bilden mxn array. Da Herr Boardrider zu Recht vorschlug, ein praktikables Beispiel zu geben, würde folgendes Beispiel im Großen und Ganzen vermitteln, was ich zu tun beabsichtige

%Vor%

Wenn die Längen von x und y zunehmen, benötigt das System immer mehr Zeit. In Bezug auf dieses Beispiel möchte ich diesen Code so ausführen, dass ich, wenn ich 4 Kerne habe, jedem einen Viertel des Jobs geben kann, dh einen Job geben, um die Elemente r[0] bis r[24999] für den ersten Kern,% co_de, zu berechnen % bis r[25000] für den zweiten Kern, r[49999] bis r[50000] für den dritten Kern und r[74999] bis r[75000] für den vierten Kern. Schließe schließlich die Ergebnisse an, füge sie an, um ein einzelnes Array r[99999] bis r[0] zu erhalten.

Ich hoffe, dieses Beispiel macht die Dinge klar. Wenn mein Problem immer noch nicht klar ist, bitte erzählen.

    
Ishan Tomar 21.09.2016, 08:16
quelle

1 Antwort

6

Das erste, was zu sagen ist: Wenn es sich um mehrere Kerne auf demselben Prozessor handelt, ist numpy bereits in der Lage, die Operation besser zu parallelisieren als wir es von Hand tun könnten (siehe die Diskussion in Multiplikation großer Arrays in Python )

In diesem Fall würde der Schlüssel einfach darin bestehen, sicherzustellen, dass die Multiplikation alles in einer Großmengen-Array-Operation und nicht in Python for -loop durchgeführt wird:

%Vor%

[Wenn Sie dies tatsächlich über mehrere separate CPUs verteilen wollten, ist das eine andere Sache, aber die Frage scheint eine einzelne (Multi-Core-) CPU vorzuschlagen.]

OK, bedenken Sie Folgendes: Angenommen, Sie möchten eine Operation, die komplizierter als nur mult() ist, parallelisieren. Nehmen wir an, Sie haben versucht, Ihre Operation in Großmengen-Array-Operationen zu optimieren, die numpy parallelisieren kann, aber Ihre Operation ist dafür nicht anfällig. In diesem Fall können Sie einen gemeinsam genutzten Speicher multiprocessing.Array verwenden, der mit lock=False und multiprocessing.Pool erstellt wurde, um Prozesse zuzuweisen, die nicht überlappende Teile davon adressieren, aufgeteilt auf die Dimension y (und gleichzeitig über x wenn du willst). Eine Beispielliste ist unten angegeben. Beachten Sie, dass dieser Ansatz nicht genau das tut, was Sie angeben (club die Ergebnisse zusammen und fügen Sie sie in einem einzigen Array an). Es macht vielmehr etwas effizienteres: Mehrere Prozesse fügen gleichzeitig ihre Teile der Antwort in nicht überlappenden Teilen des gemeinsamen Speichers zusammen. Sobald dies erledigt ist, ist kein Vergleich / Anhängen mehr nötig: Wir lesen nur das Ergebnis aus.

%Vor%     
jez 04.10.2016 15:30
quelle