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.

questionAnswers(1)

yourAnswerToTheQuestion