Unterschied zwischen OpenMP und privaten threadprivate
Ich bin versucht zu parallelisieren, ein C-Programm mit OpenMP.
Ich würde gerne mehr wissen über:
- Die Unterschiede zwischen den threadprivate - Richtlinie und der private - Klausel und
- In welchen Fällen müssen wir alle von Ihnen verwenden.
Soweit ich weiß, der Unterschied ist der Globale Geltungsbereich, der mit threadprivate und der erhaltene Wert über parallele Regionen. Ich fand an mehreren Beispielen, dass, wenn ein Stück code enthält einige Globale/statische Variablen, die müssen privatisiert werden, werden diese Variablen in einem threadprivate Liste und Ihre ursprünglichen Werte kopiert man in die private Kopien mit copyin.
Jedoch gibt es eine Regel, die verhindert, dass uns der private Klausel zum Umgang mit globalen/statischen Variablen? vielleicht irgendein detail?
Konnte ich nicht finden, eine Erklärung, in der OpenMP3.0-Spezifikation.
InformationsquelleAutor der Frage L30nardo SV. | 2013-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wichtigsten Unterschiede, die Sie auswendig lernen müssen:
Einen
private
ist Sie eine lokale variable in einer region, und wird die meiste Zeit auf der stack. Die Lebensdauer der Variablen in die Privatsphäre ist die Dauer definiert, der die Daten scoping-Klausel. Jeder thread (einschließlich der master-thread), macht sich eine private Kopie der ursprünglichen Variablen (die neue variable wird nicht mehr-Speicher-verbunden mit der ursprünglichen Variablen).Einen
threadprivate
variable auf der anderen Seite werden wahrscheinlich platziert in der heap oder in der thread local storage (das kann man als einen globalen Speicher lokal zu einem thread). Einthreadprivate
variable bleiben in den Regionen (je einige Einschränkungen). Der master-thread verwendet die original-variable, die alle anderen threads machen, sich eine private Kopie der ursprünglichen Variablen (die master-variable ist immer noch die Speicherung-im Zusammenhang mit der ursprünglichen Variablen).Gibt es auch komplizierter Unterschiede:
Variablen definiert als
private
sind nicht definiert für jeden thread beim Eintritt in das Konstrukt und die entsprechende shared-variable ist undefiniert, wenn die parallel-Konstrukt ist beendet; der Initiale status einesprivate
Zeiger zurücksetzen.Aber die Daten in der
threadprivate
common-blocks soll angenommen werden, undefined bei der Einreise in die erste parallele region, es sei denn, eincopyin
- Klausel angegeben ist. Wenn ein allgemeiner block wird in einemthreadprivate
Richtlinie, in jeden thread kopieren initialisiert wird einmal vor dem ersten Einsatz.Den OpenMP Spezifikationen (Abschnitt 2.14.2) eigentlich eine sehr gute Beschreibung (und auch intensiver) der
threadprivate
Richtlinie:InformationsquelleAutor der Antwort Kyle_the_hacker