2017-05-02 2 views
0

Ich bin relativ neu bei CUDA und bin derzeit im Rahmen eines Projekts zur Beschleunigung von Computer-Vision-Anwendungen in eingebetteten Systemen mit angeschlossenen GPUs (NVIDIA TX1). Ich versuche, zwischen zwei Bibliotheken zu wählen: OpenCV und VisionWorks (einschließlich OpenVX).Wie interpretiere ich die NVIDIA Visual Profiler Analyse/Empfehlungen?

Derzeit habe ich Testcodes erstellt, um den Canny Edge Detection-Algorithmus auszuführen, und die beiden Bibliotheken zeigten unterschiedliche Ausführungszeiten (VisionWorks-Implementierung benötigt etwa 30 bis 40% weniger Zeit).

Also fragte ich mich, was der Grund sein könnte, und profilierte den Kernel, der am meisten Zeit in Anspruch nimmt: 'canny :: edgesHysteresisLocalKernel' von OpenCV4Tegra, das 37,2% der gesamten Anwendung belegt (sowohl von OpenCV als auch von VisionWorks-Implementierung) und 'edgesHysteresisLocal' von VisionWorks.

Ich folgte der "geführten Analyse" und der Profiler schlug vor, dass die Anwendungen beide Latenz gebunden sind, und unten sind die Aufnahmen von 'KantenHysteresisLocal' von VisionWorks und 'canny :: KantenHystereseLokalKernel' von OpenCV4Tegra.

OpenCV4Tegra - canny::edgesHysteresisLocalKernel

VisionWorks - edgesHysteresisLocal

Also, meine Frage ist,

  • aus der Analyse, was kann ich sagen, über die Ursachen der unterschiedlichen Leistungen?

  • Darüber hinaus, wenn Profil CUDA-Anwendungen im Allgemeinen, wo ist ein guter Punkt zu starten? Ich meine, es gibt eine Menge Metriken und es ist sehr schwer zu sagen, was zu sehen ist.

  • Gibt es Schulungsmaterialien zum Profilieren von CUDA-Anwendungen im Allgemeinen? (Habe ich mich viele Dias von NVIDIA, und ich denke, sie sind nur die Definitionen der Kennzahlen zu sagen, nicht, wo aus im Allgemeinen zu starten.)

- übrigens, soweit ich weiß, , NVIDIA stellt die Quellcodes von VisionWorks und OpenCV4Tegra nicht zur Verfügung. Korrigiere mich, wenn ich falsch liege.

Vielen Dank im Voraus für Ihre Antworten.

Antwort

1

1/Die Verwendung von shared_memory unterscheidet sich zwischen den beiden Bibliotheken. Dies ist wahrscheinlich die Ursache für Leistungsabweichungen.


2/ist in der Regel drei Metriken wissen, ob mein Algorithmus gut für CUDA Geräte codiert:

  • die Speicherauslastung von Kernen (Bandbreite)
  • die Menge der verwendeten Register: ist da Register verschütten oder nicht?
  • die Menge der Shared-Memory-Bank in Konflikt

3/Ich denke, es gibt viele Dinge im Internet ist ....


eine andere Sache:

Wenn Sie nur die Verwendung eines lib im Vergleich zu anderen, um sich qualifizieren wollen das Beste zu wählen, warum brauchen Sie die jeweils Implementierungen verstehen (es ist interessant, aber nicht eine prä- Voraussetzung ist es nicht)?

Warum nicht Algorithmus Leistung mit der Zykluszeit und die Qualität der erzeugten Ergebnisse nach einer Metrik messen (false positive, mittlere Fehler auf einem Satz von Ergebnissen bekannt, ...)

+1

Ich glaube, du gemeint "Anzahl der geteilten Speicherbankkonflikte" – BlueWanderer

+0

Schon die Zeit gemessen und die produzierten Ergebnisse verglichen und sie waren fast gleich. Es war nur, dass ich mich fragte, was den Unterschied ausmacht, und wenn ich das kriegen könnte, könnte ich den Code schreiben Ich selbst, wo mehr Beschleunigung benötigt, ohne die Bibliotheken zu benutzen. Danke übrigens. –

Verwandte Themen