如何将我的 NVRTC 程序源与文件相关联?
How can I associate my NVRTC program source with a file?
我正在使用 NVRTC 编译内核。相关的 API 调用是:
nvrtcResult nvrtcCreateProgram (
nvrtcProgram* prog,
const char* src,
const char* name,
int numHeaders,
const char** headers,
const char** includeNames )
如您所见,源是原始字符串,与文件无关。这意味着当你 --generate-line-info
时,你得到行号,但没有相关的文件名。 that 意味着如果您随后使用 NSight Compute - 您将无法看到您的内核源代码。
显然,无论是 NSight Compute 本身,还是 NVRTC 本身,都无法确定原始源在某个文件中的镜像。但是必须有一些方法来解决这个问题:
- 也许我在 NVRTC API 中遗漏了一些可以使源 <-> 文件关联的东西?
- 也许我们可以操纵生成的编译程序(合理的,不是手动的,或者写我自己的新的-API)来建立关联?
- 也许我们能以某种方式将源代码推入编译后的程序中?
这是我最初的解决方法:
- 将您的源放在一个文件中,比如
my_kernel.cuh
。
- 创建字符串:
#include "my_kernel.cuh"
- 使用 NVRTC 只编译这个字符串
现在,NVRTC 能够将包含文件的源与文件相关联,因此它只是一个存根,在源<->文件关联方面将丢失。
警告:您需要注意路径 - NVRTC 的包含路径、调用程序的工作目录与源文件的目录等。
似乎 NVRTC 确实 提供了一个默认文件名,这样如果您将源放在具有该名称的文件中 - NSight Compute 可能能够找到它。
名称是您作为 name
参数传递给 nvrtcCreateProgram()
的名称。
因此,如果您的内核函数(即您的 __global__
函数)在 my_kernel.cuh
中,并且您将此文件放在配置文件程序的工作目录中(您将其告知 NSight Compute) ,或者在您构建程序所使用的包含目录之一中,您将能够阅读您的源代码。如果原始文件自己的目录也是包含目录之一,那么你很幸运,你甚至不必制作副本。
我正在使用 NVRTC 编译内核。相关的 API 调用是:
nvrtcResult nvrtcCreateProgram (
nvrtcProgram* prog,
const char* src,
const char* name,
int numHeaders,
const char** headers,
const char** includeNames )
如您所见,源是原始字符串,与文件无关。这意味着当你 --generate-line-info
时,你得到行号,但没有相关的文件名。 that 意味着如果您随后使用 NSight Compute - 您将无法看到您的内核源代码。
显然,无论是 NSight Compute 本身,还是 NVRTC 本身,都无法确定原始源在某个文件中的镜像。但是必须有一些方法来解决这个问题:
- 也许我在 NVRTC API 中遗漏了一些可以使源 <-> 文件关联的东西?
- 也许我们可以操纵生成的编译程序(合理的,不是手动的,或者写我自己的新的-API)来建立关联?
- 也许我们能以某种方式将源代码推入编译后的程序中?
这是我最初的解决方法:
- 将您的源放在一个文件中,比如
my_kernel.cuh
。 - 创建字符串:
#include "my_kernel.cuh"
- 使用 NVRTC 只编译这个字符串
现在,NVRTC 能够将包含文件的源与文件相关联,因此它只是一个存根,在源<->文件关联方面将丢失。
警告:您需要注意路径 - NVRTC 的包含路径、调用程序的工作目录与源文件的目录等。
似乎 NVRTC 确实 提供了一个默认文件名,这样如果您将源放在具有该名称的文件中 - NSight Compute 可能能够找到它。
名称是您作为 name
参数传递给 nvrtcCreateProgram()
的名称。
因此,如果您的内核函数(即您的 __global__
函数)在 my_kernel.cuh
中,并且您将此文件放在配置文件程序的工作目录中(您将其告知 NSight Compute) ,或者在您构建程序所使用的包含目录之一中,您将能够阅读您的源代码。如果原始文件自己的目录也是包含目录之一,那么你很幸运,你甚至不必制作副本。