2014-04-28 14 views
5

capisco che la risposta per questa domanda dipende l'implementazione specifica OpenCL e l'hardware, ma ho bisogno di scegliere tra sincos e native_cos seguito da native_sin per l'utilizzo di un'applicazione per Mac.OpenCL: SinCos vs native_cos e native_sin

Quale dovrebbe essere più veloce?

+2

I nativi saranno sempre più veloci. Eseguono il mapping di 1: 1 in un'istruzione HW, in genere per le GPU, questa è un'istruzione cos/sin di vertice. La precisione è definita dall'implementazione. Normale sincero, avrà una precisione beter, al costo della velocità (a seconda del sistema) – DarkZeros

+1

Solo una correzione minore e il mio valore di 2 centesimi: le funzioni native_ * non devono mappare 1: 1 alle istruzioni hardware (vedere pag 250 dello standard OpenCL 1.2). A seconda dell'implementazione, probabilmente eseguiranno meno istruzioni rispetto alla versione non nativa e quindi saranno un po 'più veloci. Ciò dipende anche dalla gamma di valori di input. Ad esempio, le implementazioni sin, cos e sincos di Nvidia hanno un percorso veloce per gli input al di sotto di un certo valore e un percorso lento per gli input al di sopra di tale valore. Quindi il tuo guadagno di velocità quando usi native_sin può dipendere dai tuoi valori di input. – chippies

+0

Le funzioni native utilizzano pipeline specializzate (meno numerose di adders/moltiplicatori) o utilizzano tutte le pipeline ma all'interno di una pianificazione della libreria hardware per ottenere risultati? –

risposta

1

È possibile aggiungere un mini benchmark per testare tutte le versioni di una funzione trascendentale e modificare di conseguenza la stringa del kernel (anteporre native_ a cos per esempio) con i risultati del benchmark. Ciò richiederebbe una profilazione basata sugli eventi ed essere appropriato per la portabilità. Quindi, una volta per ogni iterazione N, è possibile eseguire nuovamente il bench-bench e apportare piccole modifiche di conseguenza se si è verificato un errore dall'ultimo banco.

È possibile anche eseguire il benchmark delle permutazioni di una serie di funzioni (come l'uso di native per la prima funzione ma non native su second, native su third nella prima versione, quindi alternare nativity su altre 5 versioni, benchmark di tutti) per adattarle codice migliore sull'architettura della pipeline in cui l'ordine delle funzioni è importante.