如何使用 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,并在内核中对其进行了采样。
具体来说,我的问题是我的 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,并在内核中对其进行了采样。