Qualche funzione particolare per inizializzare la GPU diversa dalla prima chiamata cudaMalloc?

La prima chiamata di cudaMalloc è lenta (come 0.2 secondi) a causa di alcuni lavori di inizializzazione su GPU. C’è qualche funzione che fa solo l’inizializzazione, in modo che io possa separare il tempo? cudaSetDevice sembra ridurre il tempo a 0,15 secondi, ma continua a non eliminare tutti i sovraccarichi di init.

Una chiamata a

cudaFree(0); 

è il modo canonico per forzare la creazione di un contesto pigro nel runtime CUDA. Non è ansible ridurre il sovraccarico, ovvero una funzione dei driver, del runtime e delle latenze del sistema operativo. Ma la chiamata sopra ti permetterà di controllare come / quando questi overheads si verificano durante l’esecuzione del programma.

EDIT nel 2015 per aggiungere che l’euristica dell’inizializzazione del contesto nell’API runtime è stata leggermente modificata nel tempo in modo che cudaSetDevice ora stabilisca un contesto, quindi la chiamata cudaFree() non è richiesta esplicitamente per intializzare un contesto, è ansible utilizzare invece cudaSetDevice . Si noti inoltre che al momento del lancio del primo kernel si verificheranno ancora dei tempi di configurazione, mentre prima non era così. Per quanto riguarda la tempistica del kernel, è meglio includere una chiamata di riscaldamento prima di avviare il kernel, si avrà il tempo di rimuovere questa latenza di impostazione. Sembra che i vari strumenti di profiling abbiano una granularità sufficiente per evitarlo senza chiamate API o chiamate kernel aggiuntive.