微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在使用 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
  2. 创建字符串:
    #include "my_kernel.cuh"
    
  3. 使用 NVRTC 只编译这个字符串

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

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

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。