我可以从 CUDA __global__ 函数调用头文件中的 "function-like macro"吗?

标签 c macros cuda gpgpu

这是我的头文件 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/

相关文章:

c++ - 删除遗留代码中的宏

c++ - 在没有宏的情况下获取编译时日期和时间

cuda - 在 opencl 中 CPU 作为主机,intel HD 4000 作为设备 1,离散 GPU 作为设备 2

c - 这个函数的错误处理有问题吗?

c - Linux串口-wrtie()字节通过串口到目标设备

c - 安装了 MinCW 和 cygwin 但无法编译任何东西

用于解析日期时间的 C 库

c - 如何编写使用#ifdef 的宏函数

c++ - Cuda:最小二乘求解,速度较差

c++ - CUDA 5.0 头文件