Dies ist der Befehl PDL::ParallelCPUp, der beim kostenlosen Hosting-Anbieter OnWorks mit einer unserer zahlreichen kostenlosen Online-Workstations wie Ubuntu Online, Fedora Online, dem Windows-Online-Emulator oder dem MAC OS-Online-Emulator ausgeführt werden kann
PROGRAMM:
NAME/FUNKTION
PDL::ParallelCPU – Parallelprozessor-Multithreading-Unterstützung in PDL (experimentell)
BESCHREIBUNG
PDL unterstützt (derzeit experimentell) die Aufteilung der numerischen Verarbeitung
mehrere parallele Prozessor-Threads (oder Pthreads) mit dem set_autopthread_targ und
set_autopthread_size Funktionen. Dadurch kann die Verarbeitungsleistung (um mehr als) verbessert werden
2-4X in den meisten Fällen) durch Nutzung der Vorteile von Multi-Core- und/oder Multi-Prozessor-Maschinen.
ZUSAMMENFASSUNG
PDL verwenden;
# Legen Sie das Ziel fest, 4 parallele Pthreads zu erstellen, mit einer Untergrenze von
# 5Meg-Elemente zum Aufteilen der Verarbeitung in parallele Pthreads.
set_autopthread_targ(4);
set_autopthread_size(5);
$a = Nullen(5000,5000); # Erstellen Sie ein 25-MB-Elementarray
$b = $a + 5; # Die Verarbeitung wird in mehrere Pthreads aufgeteilt
# Ermitteln Sie die tatsächliche Anzahl der Pthreads für den letzten
# Verarbeitungsvorgang.
$actualPthreads = get_autopthread_actual();
AGB
Die Verwendung des Begriffs einfädeln kann mit PDL verwirrend sein, da es sich darauf beziehen kann PDL
einfädeln, wie in den PDL::Threading-Dokumenten definiert, oder an Prozessor Multithreading.
Um Verwirrung mit der bestehenden PDL-Threading-Terminologie zu vermeiden, verwendet dieses Dokument
pthreading zu beziehen Prozessor Multithreading, was die Verwendung mehrerer Prozessoren bedeutet
Threads, um die numerische Verarbeitung in parallele Operationen aufzuteilen.
Funktionen zur Abwicklung, Integrierung, Speicherung und Smartgeräte App PDL PThreads
Dies ist eine kurze Auflistung und Beschreibung der PDL-Pthreading-Funktionen, siehe PDL::Core
docs für detaillierte Informationen.
set_autopthread_targ
Legen Sie die Zielanzahl der Prozessor-Threads (pthreads) für die Multithread-Verarbeitung fest.
Das Setzen von auto_pthread_targ auf 0 bedeutet, dass kein Pthreading stattfindet.
Weitere Informationen finden Sie unter PDL::Core.
set_autopthread_size
Legen Sie die Mindestgröße (in Mega-Elementen oder 2**20 Elementen) der größten beteiligten PDL fest
in einer Funktion, in der Auto-Pthreading durchgeführt wird. Für kleine PDLs wahrscheinlich
Es lohnt sich nicht, mehrere Pthreads zu starten, daher wird diese Funktion verwendet, um ein Minimum zu definieren
Schwellenwert, ab dem kein Auto-Pthreading versucht wird.
Weitere Informationen finden Sie unter PDL::Core.
get_autopthread_actual
Rufen Sie die tatsächliche Anzahl der Pthreads ab, die für die letzte PDL-Verarbeitungsfunktion ausgeführt wurden.
Weitere Informationen finden Sie unter PDL::get_autopthread_actual.
Global Kontrollieren of PDL PThreading mit automatisierten Arbeitsumfeld Variablen
PDL PThreading kann global aktiviert werden, ohne dass der vorhandene Code durch Einstellungen geändert werden muss
Umgebungsvariablen PDL_AUTOPTHREAD_TARG und PDL_AUTOPTHREAD_SIZE bevor Sie eine PDL ausführen
Skript. Diese Umgebungsvariablen werden überprüft, wenn PDL startet und aufruft
set_autopthread_targ und set_autopthread_size Funktionen, die mit der Umgebung erstellt wurden
Werte der Variablen.
Wenn beispielsweise die Umgebungsvariable PDL_AUTOPTHREAD_TARG ist auf 3 gesetzt und
PDL_AUTOPTHREAD_SIZE auf 10 gesetzt ist, wird jedes PDL-Skript so ausgeführt, als ob die folgenden Zeilen ausgeführt würden
standen oben in der Datei:
set_autopthread_targ(3);
set_autopthread_size(10);
Wie It - so funktioniert es:
Der Auto-Pthreading-Prozess funktioniert durch die Analyse der Thread-Array-Dimensionen in PDL-Vorgängen
und Aufteilen der Verarbeitung basierend auf den Gewindedimensionsgrößen und der gewünschten Anzahl
pthreads (dh das pthread-Ziel oder pthread_targ). Die Offsets und Inkremente dieser PDL
Verwendet, um durch die Daten im Speicher zu scrollen, werden für jeden Pthread geändert, sodass jeder einen sieht
unterschiedlicher Datensatz bei der Verarbeitung.
Beispiel
$a = sequence(20,4,3); # Kleines 3D-Array, Größe 20,4,3
# Automatisches Pthreading einrichten:
set_autopthread_targ(2); # Ziel von 2 Pthreads
set_autopthread_size(0); # Null, damit die kleinen PDLs in diesem Beispiel pthreaded werden
# Dies wird in 2 Pthreads aufgeteilt
$c = Maximum($a);
Für das obige Beispiel ist die maximal Die Funktion hat die Signatur „(a(n); [o]c())“, die
bedeutet, dass die erste Dimension von $a (Größe 20) a ist Core Dimension der maximal
Funktion. Die anderen Abmessungen von $a (Größe 4,3) sind eingefädelt Abmessungen (d. h. werden
eingefädelt im maximal Funktion.
Der Auto-Pthreading-Algorithmus untersucht die Gewindedimensionen der Größe (4,3) und wählt die 4 aus
Dimension, da sie gleichmäßig durch autopthread_targ von 2 teilbar ist. Die Verarbeitung von
Die Maximumfunktion wird dann in zwei Pthreads in der Größe-4-Dimension mit dim aufgeteilt
Indizes 0,2 werden von einem Pthread verarbeitet
und dimmen die Indizes 1,3, die vom anderen Pthread verarbeitet werden.
Einschränkungen
Muss haben POSIX Themen Aktiviert
Auto-PThreading funktioniert nur, wenn Ihre PDL-Installation mit POSIX-Threads kompiliert wurde
ermöglicht. Dies ist normalerweise der Fall, wenn Sie Linux oder andere Unix-Varianten verwenden.
Nicht Threadsicher Code
Nicht alle Bibliotheken, zu denen PDL eine Schnittstelle herstellt, sind threadsicher, dh es wird nicht in sie geschrieben
Arbeiten Sie in einer Multithread-Umgebung, ohne abzustürzen oder Nebenwirkungen zu verursachen. Manche
Beispiele im PDL-Kern sind die fft Funktion und die pnmout Funktionen.
Um mit dieser Art von Funktionen ordnungsgemäß zu funktionieren, muss das PPCode-Flag verwendet werden NoPthread wurde
eingeführt, um eine Funktion als anzugeben nicht pthread-sicher sein. Weitere Informationen finden Sie in den PDL::PP-Dokumenten.
Größe of PDL ABMESSUNGEN und PThread Target
Aufgrund der Art und Weise, wie eine PDL für den Betrieb mit mehreren Pthreads aufgeteilt wird, ist die Größe einer
Die Dimension muss gleichmäßig durch das pthread-Ziel teilbar sein. Zum Beispiel, wenn ein PDL hat
Gewindeabmessungen von (4,3,3) und die auto_pthread_targ auf 2 gesetzt wurde, dann
Die erste Gewindedimension (Größe 4) wird ausgewählt und in zwei P-Gewinde der Größe aufgeteilt
2 und 2. Wenn die Gewindeabmessungen jedoch (3,3,3) sind und die auto_pthread_targ is
immer noch 2, dann findet kein Pthreading statt, da keine Gewindeabmessungen durch 2 teilbar sind.
Der Algorithmus, der die tatsächliche Anzahl der Pthreads auswählt, ist intelligent (könnte es aber wahrscheinlich).
verbessert werden), um sich von der nach unten anzupassen auto_pthread_targ um eine Reihe von Pthreads zu erhalten
kann eine der Gewindeabmessungen gleichmäßig aufteilen. Zum Beispiel, wenn eine PDL über Threaded verfügt
Dimensionsgrößen von (9,2,2) und die auto_pthread_targ 4 ist, erkennt der Algorithmus, dass nein
Wenn die Dimension durch 4 teilbar ist, passen Sie das Ziel dann auf 3 an, was zu einer Aufteilung führt
Die erste Gewindedimension (Größe 9) in 3 Gewindegänge aufteilen.
Schnelligkeit Verbesserung könnte be weniger als Sie erwarten von.
Wenn Sie eine 8-Kern-Maschine haben und anrufen auto_pthread_targ mit 8, um 8 parallel zu erzeugen
pthreads, Sie werden aufgrund der Speicherbandbreite wahrscheinlich keine 8-fache Verbesserung der Geschwindigkeit erzielen
Probleme. Auch wenn Sie 8 separate CPUs haben, die Daten verarbeiten, haben Sie (z
gängigsten Maschinenarchitekturen) gemeinsamer RAM, der jetzt zu Ihrem Engpass wird. Für einfach
Bei Berechnungen (z. B. einfache Additionen) kann man bei ca. an eine Leistungsgrenze stoßen
4 P-Threads. Bei komplexeren Berechnungen liegt die Grenze höher.
URHEBERRECHT
Copyright 2011 John Cerney. Sie können dieses Dokument unter denselben Bedingungen weitergeben und/oder ändern
Bedingungen wie die aktuelle Perl-Lizenz.
Siehe: http://dev.perl.org/licenses/
Verwenden Sie PDL::ParallelCPUp online über die Dienste von onworks.net