【问题标题】:Measuring and minimization of OpenCL overhead测量和最小化 OpenCL 开销
【发布时间】:2013-06-28 20:12:54
【问题描述】:

我有一个 pyopencl 程序,可以进行长时间的计算(每次运行约 3-5 小时)。我有几个内核在循环中一一启动。所以我有这样的事情:

prepare_kernels_and_data()

for i in range(big_number): # in my case big_number is 400000
  load_data_to_device(i)    # ~0.0002s
  run_kernel1(i)            # ~0.0086s
  run_kernel2(i)            # ~0.00028s
  store_data_from_device(i) # ~0.0002s

我测量了时间,得到了以下结果:

  1. 系统时间为4:30小时(通过linuxtime命令测量)
  2. 纯基于 opencl 事件的计时是 3:30 小时(加载+计算+存储)

我想知道:

  1. OpenCL 程序的最小开销有多大?在我的情况下,它是 35%
  2. 我应该相信基于事件的计时吗?
  3. 启用分析是否会显着增加整个程序执行时间?

我知道开销取决于程序,而且我知道 python 不如纯 C 或 CPP 快。但我相信,当我将所有繁重的计算转移到 OpenCL 内核时,我的损失不会超过 5-7%。如果我错了,请纠正我。

附: AMD OpenCL、AMD GPU

【问题讨论】:

    标签: opencl overhead pyopencl overhead-minimization


    【解决方案1】:

    您如何测量 OCL 时间?只使用类似的东西:

    my_event.profile.end - my_event.profile.start
    

    如果是这种情况,您还可以采用另一个类似的指标:

    my_event.profile.start - my_event.profile.queued
    

    该指标衡量用户应用程序以及执行前在运行时所花费的时间,因此是开销。该指标在第 4.4.1 节的AMD programing guide 中提出。
    他们还给出了关于分析的警告,说明命令可以批量发送,因此

    作为批处理提交的命令报告相似的开始时间和相同的 结束时间。

    如果我记得很清楚,NVIDIA 流式传输命令。但无论如何,您都可以使用它来减少开销。例如,而不是:

    Cl_prog.kernel1(…).wait()
    Cl_prog.kernel2(…).wait()
    

    你可以这样做:

    Event1 =   Cl_prog.kernel1(…)
    Event2 = Cl_prog.kernel2(…)
    Event1.wait()
    Event2.wait()
    

    等等。
    但我离题了;现在专门回答您的问题,这里有一些来自我上面提到的同一部分的输入(它来自 AMD,但我想它应该与 NVIDIA 几乎相同):

    1. “对于 CPU 设备,内核启动时间很快(几十微秒),但对于独立 GPU 设备,它可能是几百微秒”

    2. 见上文引用

    3. “在命令队列上启用分析会为所有 clEnqueue 调用增加大约 10 μs 到 40 μs 的开销”。

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 2014-09-12
      • 2020-04-08
      • 2015-05-22
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多