2013-10-05 8 views

risposta

14

Un lancio del kernel è asincrono. Ciò significa che restituisce il controllo al thread della CPU immediatamente dopo l'avvio del processo GPU, prima che il kernel abbia completato l'esecuzione.

Quindi qual è la prossima cosa nel thread della CPU qui? Uscita dell'applicazione.

All'uscita dall'applicazione, la capacità di inviare l'output allo standard output viene interrotta dal sistema operativo.

Quindi l'output generato in seguito dal kernel non ha un posto dove andare e non lo vedrete.

D'altra parte, se si utilizza cudaDeviceSynchronize(), allora il kernel è garantito per finire (e l'uscita dal kernel troveranno una coda di uscita standard di attesa), prima di l'applicazione è permesso di uscire.

+0

ma se vedi il link che ho postato, immediatamente dopo la chiamata kernal stiamo chiamando cudamemcpy (.... device to host). perché non abbiamo cudadevicesynchronize() qui? – gpuguy

+5

Poiché le operazioni CUDA (chiamate API, chiamate kernel) rilasciate allo stesso flusso, anche se asincrone, sono garantite per l'esecuzione in serie. Quindi, dato che il kernel e l'operazione cudaMecpy sono nello stesso flusso (predefinito), è possibile che cudaMemcpy non inizi finché il kernel non è completato, anche se l'avvio del kernel è asincrono (rispetto al thread host). –