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.