2013-02-14 4 views

risposta

3

Sebbene entrambi siano uguali in termini di prestazioni, è necessario tenere presente che il primo non è consigliato.

Restituire un thread all'interno di un kernel potrebbe causare un comportamento imprevisto nel resto del codice.

Per comportamento imprevisto intendo qualsiasi problema relativo all'unità minima di thread raggruppati in un ordito. Ad esempio, se nel kernel è presente un blocco if/else, questa situazione è nota come divergenza tra i thread e in un caso normale i thread restano inattivi e altri eseguono alcune istruzioni.

CUDA dal Libro di esempio, Capitolo 5, Cooperazione Discussione:

Ma nel caso di __syncthreads(), il risultato è un po 'tragica. L'architettura CUDA garantisce che nessun filo avanzerà ad un'istruzione oltre le __syncthreads() finché ogni filo nel blocco ha eseguito i __syncthreads()

così, è principalmente correlato alla sincronizzazione thread all'interno di un kernel. È possibile trovare una buona domanda/risposta su questo argomento qui: Can I use __syncthreads() after having dropped threads?

Come ho nota finale, ho usato anche che cattiva pratica e nessun problema è apparso, ma non v'è alcuna garanzia che i problemi potrebbero sorgere in futuro . È qualcosa che non consiglierei

+2

Cosa intendi per comportamento inaspettato, qual è il problema? L'ho visto in tutorial e l'ho anche usato e nessun problema mi è apparso finora. –

+0

Si prega di fornire un riferimento per il reclamo. – RoBiK

+0

@GeorgeAprilis Il problema è principalmente legato alle buone pratiche e alla sincronizzazione futura all'interno di un blocco. – pQB