Domanda

C'è questa semplice funzione che ho usato con C ++ in passato per simulare semplici forme di tassellatura.La funzione accetta un numero e un divisore.Il divisore deve essere ( una potenza di due - 1) e n deve essere compreso tra 0 e divisore.Restituisce un risultato di modulo di n% (d + 1) utilizzando & bit per bit.

Abbastanza sicuro che la funzione funzioni come:

unsigned int BitwiseMod(unsigned int n, unsigned int d){ return n & d; }

Voglio usarlo efficacemente in OpenCL e mi chiedo se funzionerà anche come lo immagino.Nella mia mente, il modulo è un'operazione molto costosa sulla GPU, ma sono abituato a usarlo per formare spazi di grandezza e altre tecniche per viaggiare attraverso i dati.

Più spesso, sarei più propenso a scrivere semplicemente questo assumendo che le funzioni abbiano un sovraccarico.

x[i] = 8*(i&d)+offset[i];  //OR in other contexts,...

num = i&d+offset[i];
x[num] = data;

La domanda è: sarà utile o sarà d'intralcio, se utile, puoi darmi alcuni esempi in cui potrei provare ad applicarlo.

È stato utile?

Soluzione

Sulle architetture NVidia, GT200 e superiori, Modulo non è particolarmente lento, né più lento di una normale divisione di numeri interi.Consulta questo documento per i dettagli.

Tuttavia, l'utilizzo di AND bit per bit è ancora molto più veloce.Poiché le chiamate di funzione sono costose sulle GPU, i compilatori OpenCL utilizzano in modo aggressivo l'inlining per migliorare le prestazioni per impostazione predefinita.Dovresti stare bene con una chiamata di funzione, poiché sarà inline.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top