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.
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
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
Verwenden native Funktionen spezialisierte Pipelines (weniger als Addierer/Multiplikatoren) oder verwenden sie alle Pipelines, aber innerhalb einer Hardwarebibliothek, um das Ergebnis zu erhalten? –