Medição de tempo
10/02/2009 2 Comentários
Freqüentemente precisamos medir o tempo de execução de um programa, especialmente quando queremos mostrar que um programa em GPU é mais rápido que um em CPU. A maioria das funções que a linguagem C oferece não servem a esse propósito, já que medem o tempo em segundos, e um programa para GPU raramente completa um segundo de execução. As bibliotecas CUDA oferecem um recurso simples para fazer essa medição, em unidades de milissegundos. Eis um exemplo de código:
# include <stdlib.h>
# include <stdio.h>
# include <cutil.h>
int main()
{
float tempo;
unsigned int timer = 0;
CUT_SAFE_CALL( cutCreateTimer( &timer));
CUT_SAFE_CALL( cutStartTimer( timer));
// Região de execução: aqui vai o trecho de código cujo
// tempo de execução queremos medir.
tempo = CUT_SAFE_CALL( cutGetTimerValue(timer));
printf(“A execução durou %5.3f milissegundos\n”, tempo);
CUT_SAFE_CALL(cutDeleteTimer(timer));
}
Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!
Mas para medir e comparar os tempos de execução na CPU e na GPU, precisamos medir o tempo da MESMA forma, senão a comparação não é válida.
Essa medição não pode ser baseado no tempo global do sistema, pois o sistema operacional pode escalonar outras tarefas durante a execução do seu kernel/programa, e medindo o tempo global, o tempo de execução destas outras tarefas será contabilizado no tempo de execução do seu kernel/programa, certo?
Como vocês costumam resolver isto?
Como vocês costumam medir o tempo na CPU?
Se você deseja medir o tempo em CPU e GPU da mesma forma, então basta garantir a sincronização de threads após lançamento do kernel e medir normalmente com sua estratégia de métrica em CPU.
Chamada cudaThreadSynchronize()
Cuidado que isso pode gerar stall em GPU e conseguinte perda de desempenho.