Question

Il y a cette fonction simple que je l'ai utilisé avec C ++ dans le passé pour simuler des formes simples de tessellation. La fonction prend un nombre et un diviseur. Le diviseur doit être ( une puissance de deux - 1) et n doit être compris entre 0 et diviseur. Elle retourne un résultat de module de n% (d + 1) en utilisant au niveau du bit &.

Assez que la fonction va comme:

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

Je suis désireux d'utiliser efficacement dans OpenCL et je me demande si cela va fonctionner comme je l'imagine aussi. Dans mon esprit, le module est une opération très coûteuse sur le GPU, mais je suis au courant de l'utiliser pour former des espaces de grandeur et d'autres techniques de Voyage à travers les données.

Le plus souvent, je serais plus susceptibles de simplement écrire ces fonctions en supposant ont un coût.

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

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

La question est:. Sera-ce utile ou obtenir de la manière, si peut utile vous me donner quelques exemples où je pourrais essayer de l'appliquer

Était-ce utile?

La solution

Les architectures de nVidia, GT200 et plus, Modulo est pas particulièrement lent, pas plus lent qu'un fossé entier normal. Voir ce papier pour plus de détails.

Cependant, en utilisant une opération de bits et est encore tout à fait beaucoup plus vite. Comme les appels de fonction sont coûteuses sur les GPU, les compilateurs OpenCL utilisent agressivement inline pour améliorer les performances par défaut. Vous devriez être très bien avec un appel de fonction, car il sera inline.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top