这是头文件的一部分:

.
.
# 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)); }
.
.

现在在aes_locl.h文件中,我声明了一个.cu函数,并包含了头文件,如下所示:
#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];
}

这将导致出现以下错误消息:
错误:只有在设备模拟模式下才允许从设备全局函数调用主机函数
我有一个示例代码,程序员用这种方式调用宏。
我可以这样称呼它吗,还是这根本不可能?如果不是这样,我希望能得到一些提示,说明什么是重写宏并将所需值赋给__ global__的最佳方法。
非常感谢你提前!!!

最佳答案

硬件没有内置的旋转指令,因此没有公开它的本质(你不能暴露一些不存在的东西!).
不过,使用移位和掩码实现起来相当简单,例如,如果x是32位,则可以向左旋转8位:

((x << 8) | (x >> 24))

其中,x << 8将所有内容向左推8位(即放弃最左边的8位),x >> 24将所有内容向右推4位(即放弃除最左边的8位以外的所有内容),按位对它们进行排序将得到所需的结果。
// # define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
# define SWAP(x) (((x << 8) | (x >> 24)) & 0x00ff00ff | ((x >> 8) | (x << 24)) & 0xff00ff00)

当然,你可以通过认识到上述做法是过分的来提高效率:
# define SWAP(x) (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8))

关于c - 我可以从CUDA __global__函数的头文件中调用“类似函数的宏”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3354863/

10-11 04:11
查看更多