Ich habe eine Frage über CUDA-Synchronisierung. Insbesondere brauche ich eine Klarstellung bezüglich der Synchronisierung von if-Anweisungen. Ich meine, wenn ich eine __synctreads() unter den Rahmen einer if-Anweisung setze, die von einem Bruchteil der Threads innerhalb des Blocks getroffen wird, was passiert dann? Ich dachte, dass einige Threads "für immer" auf die anderen Threads warten werden, die den Synchronisationspunkt nicht treffen. Also, ich schrieb und ausgeführtem Code einige Beispiel zu inspizieren:CUDA: __synctreads() innerhalb if Anweisungen
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
index += gridSize;
}
}
Erstaunlicherweise habe ich festgestellt, dass der Ausgang ein ziemlich "normal" war (64 Elemente, Blockgröße 32):
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Also ich leicht mein Code in folgenden Weise geändert:
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
vett[index] = 3;
__syncthreads();
index += gridSize;
}
}
Und der Ausgang war:
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
Wieder lag ich falsch: Ich dachte, dass die Threads in der if-Anweisung nach dem Ändern des Elements des Vektors in einem Wartezustand bleiben und nie aus dem if-Bereich herauskommen würden. Also ... könnten Sie bitte klären, was passiert ist? Wird ein Thread, der nach einem Synchronisationspunkt kommt, die an der Barriere wartenden Threads entsperren? Wenn Sie meine Situation reproduzieren müssen, habe ich CUDA Toolkit 5.0 RC mit SDK 4.2 verwendet. Vielen Dank im Voraus.
Geben Sie Häkchen (akzeptierte Antworten) an Personen, die Ihre Frage beantworten. – Yakk