如何在不使用 nvprof 的情况下获取 CUDA 事件的开始和结束时间
How to get CUDA event starting and ending time without using nvprof
我写了一些 Java 代码,使用 JCuda 来执行一些 CUDA 内核。我想分析应用程序以了解流是如何重叠的等等。我能够使用诸如 cudaEventElpasedTime 之类的 cuda 事件调用来获取内核的执行时间,但我不知道如何获取同一内核的开始和结束时间戳。
我知道 nvprof 可以生成这样的结果并显示时间线,但我找不到使用 Java 应用程序 运行 nvprof 的方法。
编辑:现在我明白了如何使用 nvprof 来分析 Java 应用程序,这要归功于答案。我仍然更喜欢使用 cudaEvent 调用来获取开始和结束时间,这样我就可以有更多的控制权。 nvprof 似乎可以获取该信息,但没有供最终用户使用的 API?
有两种方法可以做到这一点:
如果您可以通过命令行 运行 您的 JCuda 应用程序,您可以使用命令 nvprof --profile-child-processes <command to run your JCuda application>
对其进行分析
如果您无法通过命令行 运行 您的应用程序,请打开终端并使用命令 nvprof --profile-all-processes
运行 nvprof。 Nvprof 将进入守护进程模式并继续等待 CUDA activity 发生。现在像往常一样从您的 IDE 启动您的应用程序,一旦 CUDA activity 发生并且应用程序退出,nvprof 将在其终端会话中打印结果。
我写了一些 Java 代码,使用 JCuda 来执行一些 CUDA 内核。我想分析应用程序以了解流是如何重叠的等等。我能够使用诸如 cudaEventElpasedTime 之类的 cuda 事件调用来获取内核的执行时间,但我不知道如何获取同一内核的开始和结束时间戳。
我知道 nvprof 可以生成这样的结果并显示时间线,但我找不到使用 Java 应用程序 运行 nvprof 的方法。
编辑:现在我明白了如何使用 nvprof 来分析 Java 应用程序,这要归功于答案。我仍然更喜欢使用 cudaEvent 调用来获取开始和结束时间,这样我就可以有更多的控制权。 nvprof 似乎可以获取该信息,但没有供最终用户使用的 API?
有两种方法可以做到这一点:
如果您可以通过命令行 运行 您的 JCuda 应用程序,您可以使用命令
nvprof --profile-child-processes <command to run your JCuda application>
对其进行分析
如果您无法通过命令行 运行 您的应用程序,请打开终端并使用命令
nvprof --profile-all-processes
运行 nvprof。 Nvprof 将进入守护进程模式并继续等待 CUDA activity 发生。现在像往常一样从您的 IDE 启动您的应用程序,一旦 CUDA activity 发生并且应用程序退出,nvprof 将在其终端会话中打印结果。