Diferença na criação de um contexto CUDA
Eu tenho um programa que usa três kernels. A fim de obter as acelerações, eu estava fazendo uma cópia de memória fictícia para criar um contexto da seguinte forma:
__global__ void warmStart(int* f)
{
*f = 0;
}
que é lançado antes dos kernels eu quero tempo da seguinte forma:
int *dFlag = NULL;
cudaMalloc( (void**)&dFlag, sizeof(int) );
warmStart<<<1, 1>>>(dFlag);
Check_CUDA_Error("warmStart kernel");
Eu também li sobre outras formas mais simples de criar um contexto comocudaFree(0)
oucudaDevicesynchronize()
. Mas o uso dessas chamadas de API oferece tempos piores do que usar o kernel fictício.
Os tempos de execução do programa, depois de forçar o contexto, são0.000031
segundos para o kernel fictício e0.000064
segundos para ambos, o cudaDeviceSynchronize () e o cudaFree (0). Os tempos foram como uma média de 10 execuções individuais do programa.
Portanto, a conclusão que cheguei é que o lançamento de um kernel inicializa algo que não é inicializado ao criar um contexto da maneira canônica.
Então, qual é a diferença de criar um contexto dessas duas maneiras, usando um kernel e usando uma chamada de API?
Eu corro o teste em um GTX480, usando o CUDA 4.0 no Linux.