Ich benutze opencv242 + VS2010 von einem Notebook.
Ich habe versucht, einen einfachen Test des GPU-Blocks in OpenCV zu machen, aber es zeigte, dass die GPU 100-mal langsamer als CPU-Codes ist.
In diesem Code verwende ich einfach das Farbbild als Graustufenbild und verwende die Funktion cvtColor
Hier ist mein Code, PART1 ist CPU-Code (Test-CPU RGB2GRAY), PART2 ist Bild auf GPU hochladen, PART3 ist GPU RGB2GRAY, PART4 ist CPU RGB2GRAY wieder. Es gibt 3 Dinge, die mich wundern:
1 In meinem Code ist part1 0.3ms, während part4 (was genau ist mit part1) 40ms !!! 2 Der Part2, der ein Bild auf die GPU hochlädt, ist 6000ms !!! 3 Part3 (GPU Codes) ist 11ms, es ist so langsam für dieses einfache Bild!
%Vor%cvtColor macht nicht viel Arbeit, um Grau zu machen, müssen Sie nur drei Zahlen haben.
Der cvColor-Code auf der CPU verwendet SSE2-Anweisungen, um bis zu 8 Pixel gleichzeitig zu verarbeiten, und wenn Sie TBB verwenden, werden alle Kerne / Hyperthreads verwendet, die CPU läuft mit dem 10-fachen der Taktfrequenz der GPU und schließlich t müssen Daten auf die GPU und zurück kopieren.
Die meisten Antworten sind falsch. Der Grund, warum es um den Faktor 20.000 langsam ist, liegt natürlich nicht daran, dass 'CPU-Takt schneller ist' und 'es muss auf die GPU kopiert werden' (akzeptierte Antworten). Dies sind Faktoren, aber indem Sie sagen, dass Sie die Tatsache auslassen, dass Sie erheblich mehr Rechenleistung für ein Problem haben, das ekelhaft parallel ist. 20.000x Leistungsdifferenz zu sagen ist wegen der letzteren einfach so lächerlich. Der Autor wusste, dass etwas nicht in Ordnung war. Lösung:
Ihr Problem ist, dass CUDA initialisiert werden muss! Es wird immer für das erste Bild initialisiert und dauert normalerweise zwischen 1-10 Sekunden, abhängig von der Ausrichtung von Jupiter und Mars. Versuchen Sie es jetzt. Führen Sie die Berechnung zweimal durch und geben Sie ihnen beide Zeit. Sie werden wahrscheinlich in diesem Fall sehen, dass die Geschwindigkeiten in der gleichen Größenordnung liegen, nicht 20.000x, das ist lächerlich. Können Sie etwas an dieser Initialisierung vornehmen? Nein, nicht dass ich davon weiß. Es ist ein Haken.
edit: Ich habe den Beitrag gerade noch einmal gelesen. Du sagst, du liegst auf einem Notebook. Diese haben oft schäbige GPUs und CPUs mit einem fairen Turbo.
versuche mehr als einmal zu laufen ....
----------- Auszug aus Ссылка Leistung
Warum der erste Funktionsaufruf langsam ist?
Das liegt an Initialisierungsoverheads. Beim ersten GPU-Funktionsaufruf wird Cuda Runtime API implizit initialisiert. Außerdem wird bei der ersten Verwendung ein bestimmter GPU-Code für Ihre Grafikkarte kompiliert (Just In Time Compilation). Für die Leistungsmessung ist es notwendig, einen Dummy-Funktionsaufruf zu machen und erst dann Zeittests durchzuführen.
Wenn es für eine Anwendung wichtig ist, GPU-Code nur einmal auszuführen, ist es möglich, einen Kompilierungscache zu verwenden, der über mehrere Durchläufe persistent ist. Bitte lesen Sie die nvcc-Dokumentation für Details (Umgebungsvariable CUDA_DEVCODE_CACHE).
cvtColour ist eine kleine Operation, und jede Leistungssteigerung, die Sie durch die GPU erzielen, wird durch die Speichertransferzeiten zwischen Host (CPU) und Gerät (GPU) erheblich aufgewogen. Die Minimierung der Latenz dieser Speicherübertragung ist eine primäre Herausforderung für jedes GPU-Computing.
Welche GPU hast du?
Überprüfen Sie die Kompabilität der Berechnungen, vielleicht ist das der Grund.
Dies bedeutet, dass für Geräte mit CC 1.3 und 2.0 binäre Bilder sind bereit zu rennen. Für alle neueren Plattformen wird der PTX-Code für 1.3 JIT'ed zu einem Binärbild. Für Geräte mit CC 1.1 und 1.2 ist der PTX für 1.1 JIT'ed. Für Geräte mit CC 1.0 ist kein Code verfügbar und der Funktionen werfen Exception. Für Plattformen, auf denen JIT kompiliert werden soll zuerst ausgeführt, ist der Lauf langsam.