如何将标准CUDA库与NVRTC代码链接?

Bil*_*ith 5 c cuda gpu gpu-programming nvrtc

具体来说,我的问题是我有需要<curand_kernel.h>运行的CUDA代码.NVRTC默认不包括此项.据推测,当创建程序上下文(即调用nvrtcCreateProgram)时,我必须发送文件名(curand_kernel.h)以及源代码curand_kernel.h?我觉得我不应该这样做.

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

下一步:如果您已经将头文件的源代码发送到nvrtcCreateProgram,我是否还要#include在要执行的代码中使用它/如果我这样做会导致错误吗?

实现此类或类似内容的示例代码的链接将不仅仅是一个直截了当的答案; 我真的没有找到任何.

3Da*_*ave 6

您必须分别发送"文件名"和每个标题的来源.

当预处理器执行其操作时,它将使用任何#include文件名作为键来查找标头的源,具体取决于您提供的集合.

我怀疑,在这种情况下,编译器(驱动程序)没有文件系统访问权限,因此您必须以与在OpenGL中包含着色器的方式相同的方式为其提供源代码.

所以:

  • 在致电时包括您的标题名称nvrtcCreateProgram.编译器将在内部生成等效的a,std::map<string,string>其中包含由给定名称索引的每个标头的源.

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

  • 编译器将使用foo.cuh其内部映射(在您调用时创建nvrtcCreateProgram)作为索引或键,并将从该集合中检索标头源

  • 编译正常进行.

nvrtc仅提供"子集"功能的原因之一是编译器在一个有点沙盒的环境中播放,而不必使用离线编译所具有的所有支持工具和实用程序.因此,您必须手动处理正常nvcc + (gcc | MSVC| clang)组合提供的许多内容.

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

此相关链接可能会有所帮助.