有没有办法分析OpenCL或pyOpenCL程序?

时间:2015-03-16 01:12:59

标签: python opencl pyopencl

我正在尝试优化pyOpenCL程序。出于这个原因,我想知道是否有办法分析程序并查看大部分时间所需的位置。

你知道如何解决这个问题吗?

提前致谢
岸堤

编辑:例如,CUDA的nvidias nvprof会为pyCuda提供技巧,但不适用于pyOpenCL。

5 个答案:

答案 0 :(得分:3)

是的,绝对存在 - 您可以分析在设备上运行的各个PyOpenCL事件,您也可以在主机上分析整个程序。

通过将内存复制到设备,在设备上运行内核以及从设备中复制内存来返回PyOpenCL事件。

以下是分析设备事件的示例:

event = cl.enqueue_copy(queue, np_array, cl_array)
event.wait()
print (event.profile.end-event.profile.start)*1e-9

以下是主机配置文件的示例:

from time import time, strftime, gmtime
start_time = time()
# ... do some stuff like the above ^
end_time = time()
print strftime('%H:%M:%S', gmtime(end_time - start_time))

我还没有看到更全面的方式来分析PyOpenCL程序。希望有所帮助!

答案 1 :(得分:1)

确定,
我找到了一种方法:Cuda Toolkit 3.1为openCL提供了一个分析(更高版本不会)。在此程序包中使用compute visual profiler (computeprof.exe)。它适用于Windows和Linux here,可以与新的Cuda Toolkit一起安装 它看起来像这样:

Timings Total time histogram Hist 2 Hist 3

我希望这也有助于其他人。

答案 2 :(得分:1)

基本上,Nvidia的Visual Profiler(nvvp)曾用于分析OpenCL(即使是通过pyopenCL),但Nvidia停止更新它。有一个巧妙的技巧,我从pyopenCL邮件列表中提取并使用来自here的信息与nvvp合作。

基本步骤是:

  1. 使用可视化分析器的配置创建nvvp.cfg文件。
  2. 示例:

    profilelogformat CSV
    streamid
    gpustarttimestamp
    gpuendtimestamp
    gridsize
    threadblocksize
    dynsmemperblock
    stasmemperblock
    regperthread
    memtransfersize
    
    1. 创建一个bash脚本来设置环境变量并启动python / OpenCL / pyOpenCL进程。
    2. 示例:

      #!/bin/bash
      export {CL_,COMPUTE_}PROFILE=1
      export COMPUTE_PROFILE_CONFIG=nvvp.cfg
      python OpenCL_test.py
      

      这会将一个日志文件放在您可以检查的工作目录中。如果将“OPENCL_”的每次出现更改为“CUDA_”,则可以将此文件导入nvvp。有关详细信息,请参阅提供的链接。

答案 3 :(得分:1)

除了benshope's answer之外,您还应通过

创建命令队列来启用它
<form method="POST" onSubmit={this.handleSubmit} ref={(form) => {this.form = form;} } id="signupForm">

PyOpenCL examples包含执行基本概要分析的基准测试脚本(请检查queue = cl.CommandQueue(context, properties=cl.command_queue_properties.PROFILING_ENABLE) benchmark.pydump-performance.py。)

答案 4 :(得分:0)

AMD的CodeXL运作良好。