Wie gut ist die OpenCV GPU-Bibliothek für Matrixoperationen?

8

Ich verwende OpenCV für eine Anwendung in der Computer Vision. Ich möchte einige Matrixoperationen (Matrizen sind ziemlich groß) auf GPU beschleunigen und möchte Kodierung, wenn möglich, direkt in CUDA C vermeiden. OpenCV 2.4.1 hat eine Reihe von GPU-beschleunigten Funktionen. Wie gut sind sie in Ihrer Erfahrung? Ist es besser, stattdessen eine andere Bibliothek (z. B. Thrust) zu verwenden?

BEARBEITEN Anwendungsbeispiel: Quadratische euklidische Abstandsmatrix auf GPU berechnen . Derzeit ist meine GPU beschleunigte (und vektorisierte) Implementierung in Matlab mit der Parallel Computing Toolbox (PCT) etwa 5-10 mal schneller als meine C ++ Implementierung mit OpenCV.

Matlab-Implementierung:

%Vor%

UPDATE Hier ist eine weitere Matlab-Implementierung, die das gleiche erreicht (Danke an Ссылка ). Aber es läuft nur auf der CPU, weil bsxfun nicht von PCT unterstützt wird. Immer noch auf der Suche nach C ++ Alternative.

%Vor%     
Alexey 29.06.2012, 12:40
quelle

2 Antworten

3

Ich finde ArrayFire viel schneller und benutze es anstelle der GPU-Kernel in OpenCV für die Bildverarbeitung. Hier sind einige Benchmarks Ich habe ArrayFire verglichen ( (in einer anderen Schnittstelle namens LibJacket) zu OpenCV und es war auch in meinem Benchmark wahr, dass ArrayFire 2-4X schneller ist als die GPU-Funktionen in OpenCV. Von dem, was ich höre, hat NVIDIA die GPU-Kernel in OpenCV nicht geschrieben, sondern sie an jemanden vergeben, was vielleicht der Grund dafür ist, dass sie so langsam sind. Da ich nur 1 GPU verwende, kann ich ArrayFire kostenlos verwenden.

Update unter Berücksichtigung des neuen MATLAB-Codes von @Alex: Ich habe den Benchmark dieses Codes auf meinem System ausgeführt. Ich bekomme, dass die Parallel Computing Toolbox gpuArray langsamer als die CPU ist, aber Jacket und ArrayFire Kick Butt. HW-Spezifikationen sind:

%Vor%

Ergebnisse von CPU vs GPU mit Parallel Computing Toolbox gpuArray (vollständig aufgewärmt). CPU ist schneller als PCT gpuArray :

%Vor%

Ergebnisse von CPU vs GPU mit Jacket (vollständig aufgewärmt). Jacket schlägt PCT gpuArray um 3.7X und schlägt die CPU um 3x

%Vor%

Hier ist der modifizierte Code, mit dem Sie alles so einfach ausführen können:

%Vor%

Jacket unterstützt BSXFUN auf der GPU und verbessert die Geschwindigkeit etwas:

%Vor%

Beachten Sie, dass die hier verwendeten Größen ziemlich klein sind, so dass der meiste CUDA-Code, der versucht, auf diesen kleinen Größen zu laufen, wahrscheinlich schlecht funktioniert. Deshalb benutze ich gerne AccelerEyes 'Zeug, weil diese Leute das Beste aus der GPU optimiert haben, im Gegensatz zu PCT gpuArray, Thrust, OpenCV, die ich in der Vergangenheit probiert habe.

Hier sind die Ergebnisse von ArrayFire Free C ++:

%Vor%

Hier ist der ArrayFire-Code, den ich dafür geschrieben habe:

%Vor%     
Ben Stewart 29.06.2012, 13:57
quelle
1

Sie wurden von NVidia beigesteuert, haben also eine gute Leistung auf CUDA-kompatiblen Karten. Die tatsächliche Leistung hängt von der Karte selbst und der Funktion ab, die Sie verwenden.

Nach meiner Erfahrung hatten nur cvRotate und cvResize eine bessere Leistung als eine normale Intel-CPU. (Hinweis: Ich war nur an bildbezogenen Funktionen interessiert)

    
Mohammad 29.06.2012 12:51
quelle

Tags und Links