具体来说,我的问题是我有需要<curand_kernel.h>运行的CUDA代码.NVRTC默认不包括此项.据推测,当创建程序上下文(即调用nvrtcCreateProgram)时,我必须发送文件名(curand_kernel.h)以及源代码curand_kernel.h?我觉得我不应该这样做.
这很难说; 我没有设法从NVIDIA找到一个需要像这样的标准CUDA文件作为源的人,所以我真的不明白语法是什么.一些问题:curand_kernel.h还包括......我是否必须为每个问题做同样的事情?我甚至不确定NVRTC编译器是否能正常运行curand_kernel.h,因为它有一些不支持的语言功能,不存在吗?
下一步:如果您已经将头文件的源代码发送到nvrtcCreateProgram,我是否还要#include在要执行的代码中使用它/如果我这样做会导致错误吗?
实现此类或类似内容的示例代码的链接将不仅仅是一个直截了当的答案; 我真的没有找到任何.
我正在编写一个在运行时使用 NVRTC(CUDA 9.2 版和 NVRTC 7.5 版)编译的 CUDA 内核,它需要stdint.h头文件,以便拥有int32_t等类型。
如果我编写没有包含的内核源代码,它可以正常工作。例如内核
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)
编译为 PTX 代码,其中 f 定义为.visible .entry f.
但是如果内核源代码是
#include <stdint.h>
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)
它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.(也没有extern "C")。
传递-default-device使 PTX 代码.visible .func f,因此无法从主机调用该函数。
有没有办法在源代码中包含标题,并且仍然具有__global__入口功能?或者,一种知道 …