5

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

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

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

一个指向执行此操作或类似操作的示例代码的链接将比一个简单的答案更受欢迎;我真的没有找到任何东西。

4

1 回答 1

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,并在内核中对其进行采样。

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

于 2016-10-17T13:38:18.077 回答