如何在不使用nvprof的情况下获取CUDA事件的开始和结束时间

如何在不使用nvprof的情况下获取CUDA事件的开始和结束时间,cuda,jcuda,nvprof,Cuda,Jcuda,Nvprof,我编写了一些Java代码,使用JCuda执行一些CUDA内核。我想分析一下这个应用程序,以便了解流是如何重叠的等等。我能够使用cuda事件调用(如CUDAEventLPASEDTIME)来获取内核的执行时间,但我不知道如何获取同一内核的开始和结束时间戳 我知道nvprof可以生成这样的结果并显示时间线,但我没有找到一种使用Java应用程序运行nvprof的方法 编辑:多亏了这些答案,现在我了解了如何使用nvprof评测Java应用程序。我仍然更喜欢使用cudaEvent调用获取开始和结束时间,这

我编写了一些Java代码,使用JCuda执行一些CUDA内核。我想分析一下这个应用程序,以便了解流是如何重叠的等等。我能够使用cuda事件调用(如CUDAEventLPASEDTIME)来获取内核的执行时间,但我不知道如何获取同一内核的开始和结束时间戳

我知道nvprof可以生成这样的结果并显示时间线,但我没有找到一种使用Java应用程序运行nvprof的方法


编辑:多亏了这些答案,现在我了解了如何使用nvprof评测Java应用程序。我仍然更喜欢使用cudaEvent调用获取开始和结束时间,这样我就可以有更多的控制权。nvprof似乎可以获得这些信息,但最终用户没有API可以获得这些信息?

有两种方法可以做到这一点:

  • 如果可以通过命令行运行JCuda应用程序,则可以使用命令
    nvprof--profile子进程来评测它

  • 如果无法通过命令行运行应用程序,请打开终端并使用命令
    nvprof--profile all processs
    运行nvprof。Nvprof将进入守护程序模式,并一直等待CUDA活动的发生。现在,像往常一样从IDE启动应用程序,一旦CUDA活动发生且应用程序退出,nvprof将在其终端会话中打印结果


  • 有两种方法可以做到这一点:

  • 如果可以通过命令行运行JCuda应用程序,则可以使用命令
    nvprof--profile子进程来评测它

  • 如果无法通过命令行运行应用程序,请打开终端并使用命令
    nvprof--profile all processs
    运行nvprof。Nvprof将进入守护程序模式,并一直等待CUDA活动的发生。现在,像往常一样从IDE启动应用程序,一旦CUDA活动发生且应用程序退出,nvprof将在其终端会话中打印结果


  • 这是一个很好的答案。由于JCuda应用程序在多个线程上运行,我认为--profile子进程可能只返回一个JVM中的执行时间,我将对此进行研究,稍后在这里发布我的发现。这是一个很好的答案。由于JCuda应用程序在多个线程上运行,我认为--profile子进程可能只返回一个JVM中的执行时间,我将对此进行研究,稍后在这里发布我的发现。@我仍然更喜欢使用cudaEvent调用获取开始和结束时间,因为它使我能够更好地控制要分析的内容。您也可以使用Visal Profiler。在安装之后,它似乎终于可以在CUDA 8.0上再次工作。@Marco13,这只在windows下工作吗?我读到我们需要制作一个.bat来让它工作,我没有在linux下尝试过.sh脚本,我只是在Windows(8.1)下尝试过。我认为它也应该在Linux下使用
    sh
    文件工作,但我不确定(我有一段时间没有积极使用VisualProfiler,因为它不适用于JCuda,也从来没有在Linux上使用过它,但从概念上讲,我认为它应该工作…)@Shadow我仍然更喜欢使用cudaEvent调用获取开始和结束时间,因为它可以让我更好地控制要分析的内容。您也可以使用Visal Profiler。在安装之后,它似乎终于可以在CUDA 8.0上再次工作。@Marco13,这只在windows下工作吗?我读到我们需要制作一个.bat来让它工作,我没有在linux下尝试过.sh脚本,我只是在Windows(8.1)下尝试过。我认为它也应该在Linux下使用
    sh
    文件工作,但我不确定(我有一段时间没有积极使用VisualProfiler,因为它不适用于JCuda,也从来没有在Linux上使用过它,但从概念上讲,我认为它应该工作…)