2012-04-13 14 views
0

Ich habe einen Convolution-Kernel mit CUDA, der sehr oft aufgerufen wird (es wird für ein Echtzeit-Rendering verwendet). Soll ich jedesmal cudaMalloc und cudaFree aufrufen wenn ich den Kernel aufrufen will? Ich habe versucht, einen Zeiger auf das CudaMalloc-Ergebnis zu speichern und durch cudaMemcpy's Dinge vor der Ausführung des Kernels, aber seltsames Verhalten (wie leeren Speicher nach der Kernel-Ausführung)CUDA - muss ich jedes Mal Speicher reservieren und freigeben?

Ich dachte auch über die Verwendung von gepinnten Speicher aber wenn Ich muss es jedes Mal zuweisen und freigeben, wenn es die Anwendung sogar verlangsamen könnte. Wie soll ich für einen Kernel vorgehen, der sehr oft aufgerufen wird?

Antwort

2

Es klingt wie das, was Sie tun, sollte funktionieren.

Vielleicht haben Sie einen Fehler in Ihrem Kernel. Versuchen Sie, cudaThreadSynchronize- und cudaGetLastError-Aufrufe hinzuzufügen, nachdem der Kernel zum Debuggen gestartet wurde.

Ohne weitere Informationen kann ich Ihnen keine weiteren Ratschläge geben.

+0

Vielen Dank, der Call cudaGetLastError hat geholfen, anscheinend habe ich mehr Threads und Blöcke zugewiesen, als meine Grafikkarte könnte. – paulAl

+0

Sie sollten cudaGetLastError-Aufrufe nach all Ihren Cuda-Funktionen setzen, um Fehler von ihnen abzufangen. Wenn CUDA stirbt, stirbt es still ... –

3

Nein, es gibt keinen Grund für malloc/free für jeden Kernel-Aufruf. Malloc'ed Speicher bleibt gültig, bis Sie es freigeben. Wir haben viel Code, der viele Kernel auf zugewiesenem Speicher mit und ohne cudaMemcpy ausführt, um den Inhalt dazwischen zu ändern.

Ihr Problem muss woanders liegen. Versuchen Sie, es auf das kleinstmögliche Beispiel zu reduzieren, das das Problem anzeigt, und geben Sie den Code ein.

Verwandte Themen