Ich versuche, mein CUDA-Programm zu optimieren, indem ich die Parallel Nsight 2.1 Edition für VS 2010 verwende.
Mein Programm läuft auf einer Windows 7 (32-Bit)-Maschine mit einer GTX 480-Karte. Ich habe das CUDA 4.1 32-Bit-Toolkit und den 301.32-Treiber installiert.
Ein Zyklus im Programm besteht aus einer Kopie von Host-Daten auf das Gerät, der Ausführung der Kernele und der Kopie der Ergebnisse vom Gerät auf den Host.
Wie Sie im Bild der Profilerergebnisse unten sehen können, werden die Kernele in vier verschiedenen Streams ausgeführt. Der Kernel in jedem Stream basiert auf den auf das Gerät kopierten Daten in 'Stream 2'. Deshalb wird das AsyncMemcpy mit der CPU synchronisiert, bevor die Kernele in den verschiedenen Streams gestartet werden.
Was mich in dem Bild irritiert, ist die große Lücke zwischen dem Ende des ersten Kernelstarts (bei 10.5778679285) und dem Beginn der Kernelausführung (bei 10.5781500). Es dauert etwa 300 us, um den Kernel zu starten, was ein enormer Overhead in einem Verarbeitungszyklus von weniger als 1 ms ist.
Darüber hinaus gibt es keine Überlappung der Kernelausführung und der Datenkopie der Ergebnisse zurück zum Host, was den Overhead noch weiter erhöht.
Gibt es offensichtliche Gründe für dieses Verhalten?