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?