Vincular com bibliotecas CUDA de terceiros desacelera o cudaMalloc

Não é segredo que no CUDA 4.x a primeira chamada paracudaMalloc pode ser ridiculamente lento (o que foi relatado várias vezes), aparentemente um bug em drivers CUDA.

Recentemente, notei comportamentos estranhos: o tempo de execuçãocudaMalloc depende diretamente de quantas bibliotecas CUDA de terceiros eu vinculei ao meu programa (note que NÃO uso essas bibliotecas, apenas vincule meu programa a elas)

Eu fiz alguns testes usando o seguinte programa:

int main() {
  cudaSetDevice(0);
  unsigned int *ptr = 0;
  cudaMalloc((void **)&ptr, 2000000 * sizeof(unsigned int));   
  cudaFree(ptr);
return 1;
}

os resultados são os seguintes:

Vinculado com: -lcudart -lnpp -lcufft -lcublas -lcusparse -lcurand tempo de execução: 5.852449

Vinculado com: -lcudart -lnpp -lcufft -lcublas em execução: 1,425120

Vinculado com: -lcudart -lnpp -lcufft tempo de execução: 0.905424

Vinculado com: -lcudart tempo de execução: 0.394558

De acordo com o 'gdb', o tempo realmente vai para o meu cudaMalloc, então não é causado por alguma rotina de inicialização da biblioteca.

Eu me pergunto se alguém tem uma explicação plausível para isso?

questionAnswers(1)

yourAnswerToTheQuestion