1

我正在使用 NVRTC 编译内核。相关的 API 调用是:

nvrtcResult nvrtcCreateProgram ( 
    nvrtcProgram* prog,
    const char* src,
    const char* name, 
    int  numHeaders, 
    const char** headers,
    const char** includeNames )

如您所见,源是原始字符串,与文件无关。这意味着当你--generate-line-info,你得到行号,但没有相关的文件名。这意味着如果您随后使用 NSight Compute - 您将无法看到您的内核源代码。

显然,无论是 NSight Compute 本身还是 NVRTC 本身,都无法确定原始源镜像在某个文件中。但是必须有一些方法来解决这个问题:

  • 也许我在 NVRTC API 中遗漏了一些可以使源 <-> 文件关联的东西?
  • 也许我们可以操纵生成的编译程序(合理地,而不是手动,或编写我自己的新 API)来建立关联?
  • 也许我们可以以某种方式将源代码推入编译的程序中?
4

2 回答 2

1

这是我最初的解决方法:

  1. 将您的源代码放在一个文件中,例如my_kernel.cuh.
  2. 创建字符串:
    #include "my_kernel.cuh"
    
  3. 使用 NVRTC 只编译这个字符串

现在,NVRTC能够将包含文件的源与文件相关联,因此它只是一个在源<->文件关联方面将丢失的存根。

警告:您需要注意路径 - NVRTC 的包含路径、调用程序的工作目录与源文件的目录等。

于 2020-12-31T09:48:08.630 回答
1

似乎 NVRTC确实提供了默认文件名,因此如果您将源文件放在具有该名称的文件中 - NSight Compute 可能能够找到它。

该名称是您nvrtcCreateProgram()作为name参数传递给的名称。

因此,如果您的内核函数(即您的__global__函数)位于 中my_kernel.cuh,并且您将此文件放在配置文件程序的工作目录中(您告诉 NSight Compute),或者在您构建程序时使用的包含目录之一中,您'将能够阅读您的来源。如果原始文件自己的目录也是包含目录之一,那么您很幸运,您甚至不必制作副本。

于 2020-12-31T11:54:04.067 回答