Domanda

Quando valuto il mio programma, ho visto che ad un certo punto ho fino a 100 msec time lapse.Ho cercato ogni operazione, ma individualmente nessuna operazione stava prendendo questo tempo.Poi ho notato che ovunque io possa collocare CudathReadsynchronize Call, la prima chiamata dura 100 msec.Quindi ho scritto un esempio di seguito.Quando cudathreadsynchronize è chiamato alla prima riga, il valore temporale trascorso alla fine viene trovato meno di 1 msec.Ma se non viene chiamato, ci vogliono in media 110msec.

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}
.

Penso che cudathreadsynchronize () all'inizio gestisce l'inizializzazione della Biblioteca CUDA.È il modo corretto per inizializzare completamente il kernel, quindi non influenzerà la valutazione del tempo delle altre operazioni?È abbastanza, e corretto per chiamare Cudathreadsynchronize all'inizio, o c'è qualche modo corretto ..

È stato utile?

Soluzione

Per utilizzare CUDA, un "contesto CUDA" deve essere creato per la prima volta sulla GPU, questo richiede circa 70-100 ms.Nell'esempio cudaThreadSynchronize(); sta rendendo il contesto.Un contesto viene creato solo una volta per la tua applicazione.Quando si esegue l'analisi del temporizzatore, faccio una copia di memoria fittizia per creare un contesto (come hai fatto sopra usando cudaThreadSynchronize();).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top