Non è un segreto che su CUDA 4.x la prima chiamata a cudaMalloc
può essere incredibilmente lento (che è stato segnalato più volte), apparentemente un bug nel driver CUDA.collegamento con le librerie CUDA 3rd party rallenta cudaMalloc
Recentemente, ho notato un comportamento strano: il tempo di esecuzione di cudaMalloc
dipende direttamente da come molte librerie CUDA 3rd-party ho collegato al mio programma di (notare che io non utilizzare queste librerie, basta collegare il mio programma con loro)
ho corse alcuni test utilizzando il seguente programma:
int main() {
cudaSetDevice(0);
unsigned int *ptr = 0;
cudaMalloc((void **)&ptr, 2000000 * sizeof(unsigned int));
cudaFree(ptr);
return 1;
}
i risultati sono i seguenti:
Collegato con: 5,852449
Collegato con:: -lcudart -lnpp -lcufft -lcublas -lcusparse -lcurand tempo di esecuzione 1,425120
Collegato con: -lcudart -lnpp -lcufft -lcublas durata: -lcudart -lnpp -lcufft durata: 0.905424
collegato con: -lcudart durata: 0,394558
Secondo 'gdb', il tempo ind eed entra nel mio cudaMalloc, quindi non è causato da qualche routine di inizializzazione della libreria ..
Mi chiedo se qualcuno abbia una spiegazione plausibile per questo?
grazie a @talomnies, infatti l'inserimento di cudaFree all'inizio richiede tutto il tempo di esecuzione. Ho provato questo programma in origine sulla scheda grafica GT650M (core Kepler) mentre su GPU GTU5X Fermi ci vuole ancora più tempo - circa 7 secondi .. ancora NVIDIA potrebbe fare smth per ottimizzare la gestione del contesto - 7 secondi con carico di lavoro della CPU completo sembra essere troppo –
@asm: prova CUDA 5 e guarda cosa fa. Ora c'è un linker di codice dispositivo appropriato nella catena di strumenti, quindi alcuni dei sovraccarichi in fase di esecuzione potrebbero essere spostati per compilare e collegare il tempo (o almeno un po 'semplificato). Inoltre, se hai trovato che questo ha risposto alla tua domanda, potresti essere così gentile da accettarlo in modo che la tua domanda sia contrassegnata come risposta. – talonmies
Si noti che in CUDA 4.0, parte del motivo per cui l'inizializzazione CUDA richiede così tanto tempo è perché il driver sta eseguendo enormi allocazioni di memoria virtuale per l'indirizzamento virtuale unificato. – ArchaeaSoftware