Sto appena iniziando a utilizzare il pacchetto CUDArt di Julia per gestire l'elaborazione in GPU. Mi chiedo come garantire che se vado a estrarre dati dalla gpu (ad esempio usando to_host()
) che non lo faccio prima che tutti i calcoli necessari siano stati eseguiti su di esso.Come sincronizzare con Julia CUDArt?
Attraverso alcuni esperimenti, sembra che to_host(CudaArray)
rimarrà in ritardo mentre il particolare CudaArray viene aggiornato. Quindi, forse basta usare questo è sufficiente per garantire la sicurezza? Ma sembra un po 'rischioso.
In questo momento, sto utilizzando la funzione launch()
per eseguire i miei kernel, come illustrato nel pacchetto documentation.
La documentazione di CUDArt fornisce un esempio utilizzando la macro @sync
di Julia, che potrebbe sembrare deliziosa. Ma per gli scopi di @sync
ho finito con il mio "lavoro" e pronto a passare non appena il kernel viene lanciato con launch()
, non una volta che finisce. Per quanto comprendo l'operazione di launch()
- non c'è un modo per cambiare questa funzione (ad es. Per farlo attendere di ricevere l'output della funzione "lancia").
Come posso eseguire tale sincronizzazione?
Buon punto. Penso che 'device_synchronize' possa ancora essere utile in una serie di impostazioni. 1. Puoi usarlo insieme ad altre funzioni, come quelle di CUBLAS, CUSPARSE, ecc. Che non prendono flussi come argomenti. Inoltre, se stai lavorando con una singola GPU, potresti addirittura non aver bisogno di streaming, e quindi 'device_synchronize' può portare a un'applicazione un po 'più semplice. –