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

时间:2016-10-17 13:13:12

标签: c cuda gpu gpu-programming nvrtc

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

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

下一步:如果你已经将头文件的源代码发送到#include,我是否仍然必须在要执行的代码中{{1}} /它是否会导致错误,如果我这样做?

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

1 个答案:

答案 0 :(得分:6)

您必须分别发送“文件名”和每个标题的来源。

当预处理器执行其操作时,它将使用任何#include文件名作为键,根据您提供的集合查找标头的源。

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

所以:

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

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

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

    < / LI>
  • 编译正常进行。

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

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

This related link may be helpful