Die Verknüpfung mit CUDA-Bibliotheken von Drittanbietern verlangsamt cudaMalloc
Es ist kein Geheimnis, dass auf CUDA 4.x der erste Anruf erfolgtcudaMalloc
kann lächerlich langsam sein (was mehrmals gemeldet wurde), anscheinend ein Fehler in CUDA-Treibern.
Vor kurzem habe ich merkwürdiges Verhalten bemerkt: die Laufzeit voncudaMalloc
hängt direkt davon ab, wie viele CUDA-Bibliotheken von Drittanbietern ich mit meinem Programm verknüpft habe (beachte, dass ich diese Bibliotheken NICHT verwende, verlinke einfach mein Programm mit ihnen)
Ich habe einige Tests mit dem folgenden Programm durchgeführt:
int main() {
cudaSetDevice(0);
unsigned int *ptr = 0;
cudaMalloc((void **)&ptr, 2000000 * sizeof(unsigned int));
cudaFree(ptr);
return 1;
}
Die Ergebnisse sind wie folgt:
Verknüpft mit: -lcudart -lnpp -lcufft -lcublas -lcusparse -lcurund Laufzeit: 5.852449
Verknüpft mit: -lcudart -lnpp -lcufft -lcublas Laufzeit: 1.425120
Verknüpft mit: -lcudart -lnpp -lcufft Laufzeit: 0.905424
Verknüpft mit: -lcudart Laufzeit: 0.394558
Laut 'gdb' geht die Zeit tatsächlich in meinen cudaMalloc ein, sodass sie nicht durch eine Initialisierungsroutine der Bibliothek verursacht wird.
Ich frage mich, ob jemand eine plausible Erklärung dafür hat.