这是我的头文件 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];
}
这导致我出现以下错误消息:
error: calling a host function from a __ device__/__ global__ function is only allowed in device emulation mode
我有示例代码,程序员正是以这种方式调用宏的。
我可以这样调用它,还是根本不可能?如果不是,我会很感激一些提示,这些提示是重写宏并将所需值分配给 S0
的最佳方法。
非常感谢您!!!
最佳答案
我认为问题不在于宏本身 - nvcc
用于 CUDA 代码的编译过程以通常的方式运行 C 预处理器,因此以这种方式使用头文件应该没问题。我认为问题出在您对 _lrotl
和 _lrotr
的调用中。
您应该能够通过暂时删除这些调用来检查这确实是问题所在。
您应该查看 CUDA 编程指南,了解需要哪些功能来替换这些调用以在 GPU 上运行。
关于我可以从 CUDA __global__ 函数调用头文件中的 "function-like macro"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354863/