2012-03-28 6 views
2

Abschnitt B.10 von CUDA Programming Guide 4.1 erläutert, dass:CUDA-Threads werden in Zeit geschnitten. Was bedeutet das?

[...] die Anzahl der Takt durch die Vorrichtung genommen Zyklen vollständig den Faden auszuführen, [unterscheidet sich von] der Zahl von Taktzyklen das Gerät wirklich verbrachte Thread Befehle ausführen. Die erstere Zahl größer ist als der letztere, [...]

Ich verstehe, dass die erste die Wandtaktzeit für die Fertigstellung der Thread-Ausführung ist. Das zweite Mal ist das erste Mal minus der Zeit, die der Thread im Leerlauf verbracht hat. Der Thread wäre untätig, wenn seine Befehle auf Ergebnisse von vorherigen Befehlen (Befehlsabhängigkeit) warten müssen oder auf Operandenwerte aus dem Speicher warten oder an einem Synchronisationspunkt warten müssen.

Die Führung geht dann auf das zu sagen:

Die ehemalige Nummer größer ist als die letztere, da Threads Zeit in Scheiben geschnitten.

Was bedeutet zeit geschnitten in diesem Zusammenhang? Was bedeutet es, dass Threads in Zeit geschnitten sind?

Beachten Sie, dass dieser Begriff nirgendwo sonst im Handbuch erscheint. (Verzeih mir, wenn ich hier etwas übersehen habe, was durch den Kontext offensichtlich ist, bin ich kein englischer Muttersprachler.)

+0

Time Slicing bezieht sich in diesem Zusammenhang wahrscheinlich auf Pipelining. – talonmies

+0

Ich habe die Version 1.0 des CUDA-Programmierleitfadens, der 2007 veröffentlicht wurde, überprüft, und dort erscheint derselbe Wortlaut. Aber sie müssen die Begriffe durcheinander bringen. Ich bin sicher, was sie eigentlich meinen, ist Kontextwechsel, um Latenz zu verstecken, wie Sie in der Frage sagen. –

Antwort

0

Time Slicing bedeutet in diesem Zusammenhang auch .

Sie können sich eine Zeitscheibe als einen Prozentsatz der gesamten verfügbaren Ausführungszeit vorstellen.

Effektiv ist geplant, dass Ihr Thread für eine gewisse Zeit ausgeführt wird. Der Scheduler kann Ihnen jedoch nur dann eine kürzere Zeitscheibe geben, wenn andere Threads ausgeführt werden müssen.

+0

Schlagen Sie wirklich vor, dass der Scheduler * CUDA * (also NVIDIA GPU SM) Vorkaufsrechte enthält? Können Sie einen Link oder eine Quelle angeben, die dies bestätigen? – talonmies

+0

Ich bin nicht vertraut mit CUDA im Detail, ich antwortete aus einer allgemeineren Basis. Lesen Sie hierzu [OpenCL-Programmierhandbuch (PDF)] (http://developer.download.nvidia.com/compute/DevZone/docs/html/OpenCL/doc/OpenCL_Programming_Guide.pdf), Abschnitt 3.2.3, Seite 27 damit. –

+0

Vielleicht ist Preemption technisch nicht das richtige Wort für das, was die Warp-Scheduler von CUDA dort machen, aber es ist eine Art Task-Switching. –

0

Wenn mehrere Threads ausgeführt werden und sie sich eine Verarbeitungseinheit teilen müssen, wird normalerweise so verfahren, dass jedem Thread eine feste maximale Laufzeit zugewiesen wird (Ihre Timeslice) und dann ein Preempted und ein anderer Thread läuft für eine gewisse Zeit. Wenn also Ihr Thread seine Arbeit nicht in einem Zeitfenster beenden kann, muss er möglicherweise warten, bis er wieder an der Reihe ist. Wie lange das ist, hängt von der Anzahl der parallelen Threads ab, was sie tun, wie der Scheduler implementiert ist und welche Verarbeitungsressourcen verfügbar sind.

1

Time Slicing in diesem Zusammenhang bezieht sich auf die Tatsache, dass mehrere Warps auf einem Multiprozessor (SM) ausgeführt werden und dass der SM zwischen Warps wechselt, während die Ausführung läuft, um Latenz zu verbergen. Dies ist nicht dasselbe wie die Vorbelegung beim traditionellen CPU-Threading. es ist auch nicht dasselbe wie Pipelining.

Wenn Sie Code wie folgt:

if (threadIdx.x == 0 && blockIdx.x == 0) x = clock(); 

// other work done by all threads 

if (threadIdx.x == 0 && blockIdx.x == 0) y = clock(); 

Wenn es mehr als eine Verwerfung auf der SM läuft, dann wird der Wert von y-x als die tatsächliche Zeit größer sein wird verbrachte in Thread Ausführung 0 (== Warp 0). Und das liegt nicht nur daran, dass Thread 0 auf Ergebnisse von Instruktionen oder Speicherzugriffen warten muss, sondern auch auf die Zeit, die für die Ausführung anderer Warps aufgewendet wird.

Der Punkt dieser Aussage in der Programmieranleitung ist, dass es schwierig ist, clock() zu verwenden, um absolute Timing- oder Latenzmessungen durchzuführen.