首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCL开销的测量与最小化

OpenCL开销的测量与最小化
EN

Stack Overflow用户
提问于 2013-07-01 16:11:31
回答 1查看 1.4K关注 0票数 1

我有一个pyopencl程序,计算时间很长(每次运行3~5个小时)。我有几颗种子在循环中一个接一个地开始。所以我有这样的东西:

代码语言:javascript
复制
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小时(由linux time命令测量)
  2. 纯基于opencl事件的计时是3:30小时(load+calculate+store)

我想知道:

  1. OpenCL程序的最小开销有多大?在我的例子里,大概是35%
  2. 我应该相信基于事件的时间安排吗?
  3. 启用分析是否会给整个程序执行时间增加一些重要的时间?

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

OpenCL,AMD

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-02 08:30:18

你是如何测量OCL时间的?只使用以下内容:

代码语言:javascript
复制
my_event.profile.end - my_event.profile.start

如果是这样的话,您也可以使用另一个这样的度量:

代码语言:javascript
复制
my_event.profile.start - my_event.profile.queued

这个度量度量用户应用程序和运行时在执行之前所花费的时间,因此产生了开销。这个指标在4.4.1节的AMD编程指南中提出。

他们还给出了关于分析的警告,解释命令可以通过批处理发送,因此

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

如果我还记得,NVIDIA会流命令。但是在任何情况下,您都可以使用它来减少开销。例如,与其拥有:

代码语言:javascript
复制
Cl_prog.kernel1(…).wait()
Cl_prog.kernel2(…).wait()

你可以这样做:

代码语言:javascript
复制
Event1 =   Cl_prog.kernel1(…)
Event2 = Cl_prog.kernel2(…)
Event1.wait()
Event2.wait()

诸若此类。

但我离题了;现在,为了具体回答您的问题,这里有一些来自我前面提到的部分(这是AMD的输入,但我想NVIDIA应该差不多一样):

  1. 对于CPU设备,内核启动时间很短(几十秒),但对于离散GPU设备,则可能是几百秒。
  2. 见上文引文
  3. “在命令队列上启用分析会给所有clEnqueue调用增加大约10μs到40μs的开销”。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17409013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档