1

这是我的头文件的一部分aes_locl.h

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

现在从.cu文件中我声明了一个__ global__函数并包含这样的头文件:

#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];
}

这导致我收到以下错误消息:

错误:从 __ device__/__ global__ 函数调用主机函数只允许在设备仿真模式下

我有示例代码,程序员以这种方式调用宏。

我可以这样称呼它,还是根本不可能?如果不是,我将欣赏一些关于重写宏并将所需值分配给S0.

非常感谢你!!!!

4

3 回答 3

4

我认为问题不在于宏本身 -nvcc用于 CUDA 代码的编译过程以通常的方式运行 C 预处理器,因此以这种方式使用头文件应该没问题。_lrotl我相信问题出在您对and的调用中_lrotr

您应该能够通过暂时删除这些调用来检查这确实是问题所在。

您应该查看 CUDA 编程指南,了解需要哪些功能来替换这些调用才能在 GPU 上运行。

于 2010-07-29T07:34:37.450 回答
2

硬件没有内置的旋转指令,因此没有内在的公开它(你不能公开不存在的东西!)。

不过,使用移位和掩码实现相当简单,例如,如果 x 是 32 位,那么您可以向左旋转 8 位:

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

Wherex << 8将向左推所有 8 位(即丢弃最左边的 8 位),x >> 24将所有向右推 24 位(即丢弃除最左 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))
于 2010-08-03T10:57:49.113 回答
0

该错误说明了问题的真正含义。您正在从 CUDA 函数内部调用另一个文件(属于 CPU 代码)中定义的函数/宏。这是不可能的!

您不能从 GPU 函数调用 CPU函数/宏/代码。

您应该将定义( CUDA 中是否存在_lrotl()?)放在将由nvcc编译的同一文件中。

于 2010-07-28T16:17:33.413 回答