如何将我的 NVRTC 程序源与文件相关联?

Posted

技术标签:

【中文标题】如何将我的 NVRTC 程序源与文件相关联?【英文标题】:How can I associate my NVRTC program source with a file? 【发布时间】:2021-04-07 16:18:48 【问题描述】:

我正在使用 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)来建立关联? 也许我们可以以某种方式将源代码塞入编译后的程序中?

【问题讨论】:

【参考方案1】:

这是我最初的解决方法:

    将您的源文件放在一个文件中,例如my_kernel.cuh。 创建字符串:
    #include "my_kernel.cuh"
    
    使用 NVRTC 仅编译此字符串

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何将我的 NVRTC 程序源与文件相关联?的主要内容,如果未能解决你的问题,请参考以下文章

将我的 QT 应用程序与 Inno Setup 中的视频/图像文件相关联

如何将我的用户的支出与他们在 Firebase 中的个人资料相关联?

如何使用 .desktop 文件(在 linux 下)将文件扩展名与应用程序相关联?

cpack:如何在安装过程中将程序与文件扩展名关联?

如何将程序与文件类型关联,但仅适用于当前用户?

将我的客户分析帐户与我自己的 Adwords 帐户相关联