如何使用 NVRTC 代码将标准 CUDA 库包含到 link?

How do you include standard CUDA libraries to link with NVRTC code?

具体来说,我的问题是我的 CUDA 代码需要 <curand_kernel.h> 到 运行。默认情况下,这不包含在 NVRTC 中。大概然后在创建程序上下文时(即调用 nvrtcCreateProgram),我必须发送文件名(curand_kernel.h)以及 curand_kernel.h 的源代码?我觉得我不应该那样做。

很难说;我还没有设法从 NVIDIA 找到一个需要像这样的标准 CUDA 文件作为来源的例子,所以我真的不明白语法是什么。一些问题:curand_kernel.h 也有包含...我是否必须对其中的每一个都做同样的事情?我什至不确定 NVRTC 编译器是否会在 curand_kernel.h 上正确 运行,因为它不支持某些语言功能,不是吗?

下一篇:如果你把头文件的源代码发给了nvrtcCreateProgram,我还要在代码中#include执行吗/会不会报错如果我这样做?

A link 执行此操作或类似操作的示例代码比直接回答更受欢迎;我真的没找到。

您必须分别发送 "filename" 和每个 header 的来源。

当预处理器执行它的操作时,它会根据您提供的 collection 使用任何 #include 文件名作为关键字来查找 header 的源。

我怀疑,在这种情况下,编译器 (driver) 没有文件系统访问权限,因此您必须以与着色器包含在OpenGL。

所以:

  • 打电话给 nvrtcCreateProgram 时包括你的 header 的名字。编译器将在内部生成 std::map<string,string> 的等价物,其中包含每个 header 的源代码,这些 header 由给定名称索引。

  • 在您的内核源代码中,照常使用 #include "foo.cuh"

  • 编译器将使用 foo.cuh 作为其内部映射(在您调用 nvrtcCreateProgram 时创建)的索引或键,并将检索 header 源从那个 collection

  • 编译正常进行。

nvrtc 仅提供 "subset" 功能的原因之一是编译器在某种程度上是沙盒环境中运行,不一定具有离线编译所具有的所有支持工具和实用程序.因此,您必须手动处理普通 nvcc + (gcc | MSVC| clang) 组合提供的许多内容。

一种可能但 non-ideal 的解决方案是在 IDE 中预处理您需要的文件,保存结果,然后 #include。但是,我敢打赌有更好的方法可以做到这一点。如果您只想要 curand,请考虑深入库并提取您需要的部分(blech)或使用另一个 GPU-friendly rand 实现。在较旧的 CUDA 版本上,我只是在主机上生成了一大堆随机浮点数,将其上传到 GPU,并在内核中对其进行了采样。

This related link may be helpful.