2011-12-12 25 views
19

Ho letto che è possibile utilizzare i kernel lanciare per sincronizzare diversi blocchi, ovvero, se voglio che tutti i blocchi completino l'operazione 1 prima di passare all'operazione 2, dovrei inserire l'operazione 1 in un kernel e operazione 2 in un altro kernel. In questo modo, posso ottenere la sincronizzazione globale tra i blocchi. Tuttavia, la guida alla programmazione cuda c menziona che le chiamate al kernel sono asincrone. la CPU non aspetta che finisca la prima chiamata del kernel e quindi, la CPU può anche chiamare il secondo kernel prima che sia terminata la prima. Tuttavia, se questo è vero, allora non possiamo usare i lanci del kernel per sincronizzare i blocchi. Per favore fatemi sapere dove sto andando maleLe chiamate al kernel cuda sono sincrone o asincrone

risposta

28

Le chiamate del kernel sono asincrone dal punto di vista della CPU, quindi se chiamate 2 kernel in successione il secondo verrà chiamato senza attendere che il primo termini. Significa solo che il controllo ritorna immediatamente alla CPU.

Sul lato GPU, se non sono stati specificati flussi diversi per eseguire il kernel, verranno eseguiti dall'ordine in cui sono stati richiamati (se non si specifica un flusso entrambi vanno al flusso predefinito e vengono eseguiti in serie). Solo dopo che il primo kernel è finito, il secondo verrà eseguito.

Questo comportamento è valido per i dispositivi con capacità di calcolo 2.x che supportano l'esecuzione concomitante del kernel. Sugli altri dispositivi, anche se le chiamate al kernel sono ancora asincrone, l'esecuzione del kernel è sempre sequenziale.

Controllare la guida alla programmazione CUDA C nella sezione 3.2.5 che ogni programmatore CUDA dovrebbe leggere.

0

L'esecuzione simultanea del kernel è supportata dalla versione di capacità CUDA 2.0.

Inoltre, un ritorno al codice CPU può essere effettuato prima di tutto il kernel di warp per aver funzionato.

In questo caso, è possibile fornire la sincronizzazione da soli.

2

La risposta accettata non è sempre corretta.

Nella maggior parte dei casi, il lancio del kernel è asincrono. Ma nel caso seguente, è sincrono. E sono facilmente ignorati dalle persone.

  • ambiente variabile CUDA_LAUNCH_BLOCKING uguale a 1.
  • usando un profilatore (nvprof), senza attivare kernel concomitante profiling
  • memcpy che coinvolgono memoria host che non è page-locked.

programmatori possibile disattivare globalmente asincronia di kernel lancia per tutte le applicazioni CUDA esecuzione su un sistema impostando la variabile di ambiente CUDA_LAUNCH_BLOCKING a 1. Questa funzione viene fornita solo per il debug e non dovrebbe essere usato come un modo per far funzionare il software di produzione in modo affidabile.

I lanci di kernel sono sincroni se i contatori hardware vengono raccolti tramite un profiler (Nsight, Visual Profiler) a meno che non sia abilitato il profiling del kernel simultaneo. Le copie asincrone della memoria saranno anche sincrone se coinvolgono la memoria host che non è bloccata a pagina.

Dalla guida di programmazione NVIDIA CUDA (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device).

Problemi correlati