Pregunta

Cuando evaluaré mi programa, vi que en algún momento obtengo hasta 100msec Time Lapse.He buscado en todas las operaciones, pero individualmente ninguna operación estaba tomando esta vez.Luego me he dado cuenta de que dondequiera que haga CUDATHREADSYNCHRONIZE CALL, la primera llamada toma 100 ms.Luego he escrito tal ejemplo a continuación.Cuando CudathReadsynchronize se llama en la primera línea, el valor de tiempo transcurrido al final se encuentra menos de 1 ms.Pero si no se llama, entonces se tarda 110 ms en promedio.

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;
}

Creo que CudathReadsynchronize () al inicio maneja la inicialización de la biblioteca de CUDA.¿Es la forma correcta de inicializar completamente el kernel, por lo que no afectará la evaluación del tiempo de otras operaciones?Es suficiente, y corregirlo para llamar a CudathReadsynchronize al inicio, o existe una forma correcta.

¿Fue útil?

Solución

Para usar CUDA, se debe crear primero un 'contexto CUDA' en la GPU, esto toma alrededor de 70-100 ms.En su ejemplo, cudaThreadSynchronize(); está haciendo el contexto.Un contexto se crea solo una vez para su solicitud.Cuando realice un análisis de tiempo, también hago una copia de memoria ficticia para crear un contexto (como lo ha hecho anteriormente usando cudaThreadSynchronize();).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top