Quasi ovunque leggo sulla programmazione con CUDA, si fa menzione dell'importanza che tutti i thread in un warp facciano la stessa cosa.
Nel mio codice ho una situazione in cui non posso evitare una determinata condizione. Ecco come si presenta:CUDA: sincronizzazione dei thread
// some math code, calculating d1, d2
if (d1 < 0.5)
{
buffer[x1] += 1; // buffer is in the global memory
}
if (d2 < 0.5)
{
buffer[x2] += 1;
}
// some more math code.
Alcuni dei fili potrebbe entrare in uno per le condizioni, alcuni potrebbero entrare in entrambi e altri potrebbero non entrare in uno.
Ora per fare in modo che tutto il thread ritorni a "fare la stessa cosa" di nuovo dopo le condizioni, dovrei sincronizzarli dopo le condizioni usando __syncthreads()
? O questo in qualche modo accade automagicamente?
È possibile che due thread siano non facendo la stessa cosa a causa del fatto che uno di essi è un'operazione dietro, rovinandolo così per tutti? O c'è qualche sforzo dietro le quinte per convincerli a fare di nuovo la stessa cosa dopo una filiale?
Fammi vedere se capisco. Pertanto, se i rami condizionali eseguono la stessa quantità di lavoro, ciò non dovrebbe influire sulle prestazioni, poiché ciascun thread non sarà inattivo per troppo tempo. Ho ragione? –
@omegatai Mi rendo conto che il tuo commento è vecchio, ma altri potrebbero volerlo sapere, quindi ecco qui: Un curvatura può elaborare solo un'istruzione alla volta, quindi se alcuni dei fili in un ordito fanno una cosa e il resto dei fili fare qualcos'altro, il tempo totale è la somma delle quantità di tempo per quei due gruppi di thread. Non c'è sovrapposizione di tempo in un ordito. Le prestazioni sono influenzate. –