2014-04-28 29 views
5

Ich verstehe, dass die Antwort auf diese Frage auf der spezifischen OpenCL Implementierung abhängt und die Hardware, aber ich muß wählen zwischen sincos und native_cos von native_sin gefolgt in einer Mac App.OpenCL: sincos vs native_cos und native_sin

Welche wird voraussichtlich schneller sein?

+2

Native werden immer schneller sein. Sie ordnen 1: 1 einem HW-Befehl zu, typischerweise für GPUs ist dies ein cos/sin-Vertex-Befehl. Die Genauigkeit ist die Implementierung definiert. Normale Sincos, haben eine höhere Genauigkeit, auf Kosten der Geschwindigkeit (abhängig vom System) – DarkZeros

+1

Nur eine kleine Korrektur und meine 2 Cent Wert: native_ * Funktionen müssen nicht 1: 1 zu Hardware-Anweisungen zuordnen (siehe S. 250) des OpenCL 1.2-Standards). Abhängig von der Implementierung werden sie wahrscheinlich auf weniger Anweisungen als die nicht-native Version abgebildet und sind daher etwas schneller. Dies hängt auch vom Bereich der Eingabewerte ab. Zum Beispiel haben die sin, cos und sincos Implementierungen von Nvidia einen schnellen Pfad für Eingaben unterhalb eines Wertes und einen langsamen Pfad für Eingaben oberhalb dieses Wertes. Daher kann Ihr Geschwindigkeitsgewinn bei der Verwendung von native_sin von Ihren Eingabewerten abhängen. – chippies

+0

Verwenden native Funktionen spezialisierte Pipelines (weniger als Addierer/Multiplikatoren) oder verwenden sie alle Pipelines, aber innerhalb einer Hardwarebibliothek, um das Ergebnis zu erhalten? –

Antwort

1

Sie können eine Mini-Benchmark-Tests alle Versionen einer transzendentalen Funktion hinzufügen und die Kernel-string entsprechend (Voranstellen native_ zu einem cos zum Beispiel.) Mit den Benchmark-Ergebnisse verändern. Dies würde eine ereignisbasierte Profilerstellung erfordern und für die Portabilität geeignet sein. Dann, einmal für jede N Iterationen, könnte es sich erneut auswerten und geringfügige Änderungen entsprechend haben, wenn es einen Fehler von der letzten Bank gab.

Sie können sogar Benchmarks für Permutationen einer Reihe von Funktionen (wie native für die erste Funktion, aber nicht nativ an zweiter, nativ an dritter Stelle in der ersten Version, dann alternative nativity an anderen 5 Versionen, Benchmark alle) Code besser auf Pipeline-Architektur, wo Reihenfolge der Funktionen von Bedeutung ist.