OpenCL AMD vs NVIDIA Leistung

8

Ich habe einen einfachen Kernel implementiert, bei dem es sich um eine Art Faltung handelt. Ich habe es auf NVIDIA GT 240 gemessen. Es dauerte 70 ms bei CUDA und 100 ms bei OpenCL. Ok, dachte ich, der NVIDIA-Compiler ist besser für CUDA optimiert (oder ich mache etwas falsch). Ich muss es auf AMD GPUs ausführen, also habe ich zum AMD APP SDK migriert. Genau der gleiche Kernel-Code.

Ich machte zwei Tests und ihre Ergebnisse waren entmutigend für mich: 200 ms bei HD 6670 und 70 ms bei HD 5850 (die gleiche Zeit wie für GT 240 + CUDA). Und ich bin sehr interessiert an den Gründen für solch seltsames Verhalten.

Alle Projekte wurden auf VS2010 mit den Einstellungen der Beispielprojekte von NVIDIA bzw. AMD erstellt.

Bitte betrachten Sie meinen Beitrag nicht als NVIDIA-Werbung. Ich verstehe gut, dass HD 5850 leistungsfähiger als GT 240 ist. Das einzige, was ich wissen möchte, ist, warum solch ein Unterschied ist und wie man das Problem behebt.

Aktualisierung. Unten ist der Kernel-Code, der in der Basis 6 gleich große Vorlagenbilder sucht. Jedes Pixel des Basisbildes wird als möglicher Ursprung einer der Vorlagen betrachtet und von einem separaten Thread verarbeitet. Der Kernel vergleicht die R, G, B-Werte jedes Pixels des Basisbildes und des Templates Eins, und wenn mindestens eine Differenz diff -Parameter überschreitet, wird das entsprechende Pixel nicht angepasst gezählt. Wenn die Anzahl nicht übereinstimmender Pixel kleiner als maxNonmatchQt ist, wird die entsprechende Vorlage getroffen.

%Vor%

Kernel-Run-Konfiguration: Globale Arbeitsgröße = (1900, 1200) Lokale Arbeitsgröße = (32, 8) für AMD und (32, 16) für NVIDIA.

Ausführungszeit: HD 5850 - 69 ms, HD 6670 - 200 ms, GT 240 - 100 ms.

Alle Anmerkungen zu meinem Code werden ebenfalls sehr geschätzt.

    
AdelNick 23.01.2012, 11:32
quelle

2 Antworten

3
___ tag123opencl ___ OpenCL (Open Computing Language) ist ein Framework zum Schreiben von Programmen, die auf heterogenen Plattformen laufen, die aus CPUs, GPUs und anderen Prozessoren bestehen. ___ qstnhdr ___ OpenCL AMD vs NVIDIA Leistung ___ antwort19621294 ___

Der Unterschied in den Ausführungszeiten wird durch Compiler verursacht. Ihr Code kann leicht vektorisiert werden. Betrachten Sie Bild und Templates als Vektoren des Vektortyps char4 (die vierte Koordinate jedes char4-Vektors ist immer 0). Anstatt 3 Speicher liest:

%Vor%

verwende nur eins:

%Vor%

Statt sperrig, wenn:

%Vor%

verwende schnell:

%Vor%

Damit erhöhen Sie die Leistung Ihres Codes um bis zu 3 Mal (wenn der Compiler den Code nicht selbst vektorisiert). Ich nehme an, dass der AMD OpenCL-Compiler keine solche Vektorisierung und andere Optimierungen durchführt. Aus meiner Erfahrung kann OpenCL auf NVIDIA-GPU normalerweise schneller als CUDA gemacht werden, weil es niedriger ist.

    
___ tag123nvidia ___ Ein amerikanisches globales Technologieunternehmen mit Sitz in Santa Clara, Kalifornien, bekannt für seine Grafikprozessoren (GPUs). ___ answer14707066 ___

Es kann keine genaue perfekte Antwort dafür geben. Die OpenCL-Leistung hängt von vielen Parametern ab. Die Anzahl der Zugriffe auf den globalen Speicher, die Effizienz des Codes usw. Außerdem ist es sehr schwierig, zwischen zwei Geräten zu vergleichen, da sie verschiedene lokale, globale, konstante Speicher haben können. Anzahl der Kerne, Frequenz, Speicherbandbreite, noch wichtiger die Hardwarearchitektur etc.

Jede Hardware bietet eine eigene Leistungssteigerung, z. B. native_ von NVIDIA. Sie müssen also mehr über die Hardware herausfinden, an der Sie arbeiten, die tatsächlich funktionieren könnte. Aber was ich persönlich empfehlen würde, ist die Verwendung solcher hardwarespezifischer Optimierungen, die die Flexibilität Ihres Codes beeinträchtigen könnten.

Sie können auch einige veröffentlichte Veröffentlichungen finden, die zeigen, dass CUDA-Leistung viel besser ist als die OpenCL-Leistung auf derselben NVIDIA-Hardware.

Es ist also immer besser, Code zu schreiben, der eine gute Flexibilität bietet, als gerätespezifische Optimierungen.

    
___ qstntxt ___

Ich habe einen einfachen Kernel implementiert, bei dem es sich um eine Art Faltung handelt. Ich habe es auf NVIDIA GT 240 gemessen. Es dauerte 70 ms bei CUDA und 100 ms bei OpenCL. Ok, dachte ich, der NVIDIA-Compiler ist besser für CUDA optimiert (oder ich mache etwas falsch). Ich muss es auf AMD GPUs ausführen, also habe ich zum AMD APP SDK migriert. Genau der gleiche Kernel-Code.

Ich machte zwei Tests und ihre Ergebnisse waren entmutigend für mich: 200 ms bei HD 6670 und 70 ms bei HD 5850 (die gleiche Zeit wie für GT 240 + CUDA). Und ich bin sehr interessiert an den Gründen für solch seltsames Verhalten.

Alle Projekte wurden auf VS2010 mit den Einstellungen der Beispielprojekte von NVIDIA bzw. AMD erstellt.

Bitte betrachten Sie meinen Beitrag nicht als NVIDIA-Werbung. Ich verstehe gut, dass HD 5850 leistungsfähiger als GT 240 ist. Das einzige, was ich wissen möchte, ist, warum solch ein Unterschied ist und wie man das Problem behebt.

Aktualisierung. Unten ist der Kernel-Code, der in der Basis 6 gleich große Vorlagenbilder sucht. Jedes Pixel des Basisbildes wird als möglicher Ursprung einer der Vorlagen betrachtet und von einem separaten Thread verarbeitet. Der Kernel vergleicht die R, G, B-Werte jedes Pixels des Basisbildes und des Templates Eins, und wenn mindestens eine Differenz %code% -Parameter überschreitet, wird das entsprechende Pixel nicht angepasst gezählt. Wenn die Anzahl nicht übereinstimmender Pixel kleiner als %code% ist, wird die entsprechende Vorlage getroffen.

%Vor%

Kernel-Run-Konfiguration: Globale Arbeitsgröße = (1900, 1200) Lokale Arbeitsgröße = (32, 8) für AMD und (32, 16) für NVIDIA.

Ausführungszeit: HD 5850 - 69 ms, HD 6670 - 200 ms, GT 240 - 100 ms.

Alle Anmerkungen zu meinem Code werden ebenfalls sehr geschätzt.

    
___ tag123gpgpu ___ GPGPU ist ein Akronym für den Bereich der Informatik bekannt als "General Purpose Computing auf der Graphics Processing Unit (GPU)" ___
gudasergey 27.10.2013 17:48
quelle
0

Es kann keine genaue perfekte Antwort dafür geben. Die OpenCL-Leistung hängt von vielen Parametern ab. Die Anzahl der Zugriffe auf den globalen Speicher, die Effizienz des Codes usw. Außerdem ist es sehr schwierig, zwischen zwei Geräten zu vergleichen, da sie verschiedene lokale, globale, konstante Speicher haben können. Anzahl der Kerne, Frequenz, Speicherbandbreite, noch wichtiger die Hardwarearchitektur etc.

Jede Hardware bietet eine eigene Leistungssteigerung, z. B. native_ von NVIDIA. Sie müssen also mehr über die Hardware herausfinden, an der Sie arbeiten, die tatsächlich funktionieren könnte. Aber was ich persönlich empfehlen würde, ist die Verwendung solcher hardwarespezifischer Optimierungen, die die Flexibilität Ihres Codes beeinträchtigen könnten.

Sie können auch einige veröffentlichte Veröffentlichungen finden, die zeigen, dass CUDA-Leistung viel besser ist als die OpenCL-Leistung auf derselben NVIDIA-Hardware.

Es ist also immer besser, Code zu schreiben, der eine gute Flexibilität bietet, als gerätespezifische Optimierungen.

    
Megharaj 05.02.2013 12:00
quelle

Tags und Links