Cela fait partie de mon fichier d'en-tête aes_locl.h
:Puis-je appeler une "macro fonctionnelle" dans un fichier d'en-tête d'une fonction CUDA __global__?
.
.
# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
# define GETU32(p) SWAP(*((u32 *)(p)))
# define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); }
.
.
Maintenant, à partir du fichier .cu
je l'ai déclaré une fonction __ global__
et inclus le fichier d'en-tête comme ceci:
#include "aes_locl.h"
.....
__global__ void cudaEncryptKern(u32* _Te0, u32* _Te1, u32* _Te2, u32* _Te3, unsigned char* in, u32* rdk, unsigned long* length)
{
u32 *rk = rdk;
u32 s0, s1, s2, s3, t0, t1, t2, t3;
s0 = GETU32(in + threadIdx.x*(i))^rk[0];
}
Cela me conduit à ce qui suit message d'erreur:
error: calling a host function from a __ device__/__ global__ function is only allowed in device emulation mode
J'ai l'exemple de code où le pro grammer appelle la macro exactement de cette manière. Est-ce que je peux l'appeler de cette façon, ou est-ce que ce n'est pas possible du tout? Si ce n'est pas, j'apprécierai quelques conseils de ce qui serait la meilleure approche pour réécrire les macros et assigner la valeur désirée à S0
.
merci beaucoup d'avance !!!
Les macros sont très bien, le préprocesseur les étend tout comme on peut s'y attendre. Le problème dans ce cas, comme l'a répondu Edric, est que la macro contient des appels de fonction et que ces * fonctions * sont uniquement des hôtes. – Tom