Pergunta

Quando eu avalio o meu programa, eu vi que em algum momento eu me levanto para 100msec lapso de tempo.Eu tenho procurado em cada operação, mas, individualmente, nenhuma operação foi aproveitando esse tempo.Então eu notei que sempre que eu faço lugar cudaThreadSynchronize chamada, a primeira chamada tem 100 milissegundos.Então eu escrevi um exemplo abaixo.Quando cudaThreadSynchronize é chamado em primeira linha, o valor de tempo decorrido no final é encontrado a menos de 1 milissegundo.Mas se ele não é chamado, em seguida, leva 110msec, em média.

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

Eu acho que cudaThreadSynchronize() no início lida com a inicialização do CUDA biblioteca.É a maneira correta totalmente inicializar o kernel, por isso não irá afectar outras operações de' tempo de avaliação?É suficiente, e correto chamar cudaThreadSynchronize no início, ou se há qualquer forma correta..

Foi útil?

Solução

Para usar CUDA, 'CUDA contexto," deve ser o primeiro criado na GPU, isso leva em torno de 70-100ms.No seu exemplo cudaThreadSynchronize(); está fazendo o contexto.Um contexto é criado apenas uma vez para a sua aplicação.Ao fazer a análise de tempo, também faço um boneco de cópia de memória para criar um contexto (como você fez acima, usando cudaThreadSynchronize();).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top