Question

Quand je évaluer mon programme, j'ai vu qu'à un certain moment, je me lève à 100msec laps de temps.J'ai fouillé chaque opération, mais individuellement, aucune opération n'a été prise à ce moment.Puis j'ai remarqué que quand je ne place cudaThreadSynchronize appel, le premier appel prend 100 msec.Puis j'ai écrit un tel exemple ci-dessous.Lorsque cudaThreadSynchronize est appelé à la première ligne, le temps écoulé de la valeur à la fin est trouvé à moins de 1 msec.Mais si elle n'est pas appelée, puis il prend 110msec en moyenne.

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

Je pense que cudaThreadSynchronize() au début gère l'initialisation de la bibliothèque CUDA.Est-ce le bon moyen pour initialiser le noyau, afin de ne pas affecter d'autres opérations' évaluation en temps?Est-ce suffisant et correct de l'appeler cudaThreadSynchronize au début, ou est-il une bonne façon..

Était-ce utile?

La solution

Afin d'utiliser CUDA, un 'CUDA contexte" doit être créé en premier sur le GPU, ce qui prend environ 70-100ms.Dans votre exemple cudaThreadSynchronize(); c'est de faire le contexte.Un contexte est créé qu'une seule fois pour votre application.Quand on fait de l'analyse de timing je fais aussi un mannequin de copie de mémoire pour créer un contexte (comme vous l'avez fait ci-dessus en utilisant cudaThreadSynchronize();).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top