OpenCl 中的吞吐量计算

Posted

技术标签:

【中文标题】OpenCl 中的吞吐量计算【英文标题】:Throughput calculation in OpenCl 【发布时间】:2018-07-28 20:32:33 【问题描述】:

我正在尝试计算用我的 openCL 编写的内核的吞吐量。但我不知道该怎么做,我试图找到一些编译后生成的文件,显示吞吐量为 0.435(“在 .attrb 文件中找到”),但不确定这是什么意思。有没有其他方法可以找到吞吐量?

【问题讨论】:

【参考方案1】:

OpenCL中内核的吞吐量计算为:

(NumReadBytes + NumWriteBytes)/ElapsedTime

使用 cl_event 测量时间。

double getDuration(cl_event event)                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                         
  cl_ulong start_time, end_time;                                                                                                                                                                                                                                                        
  clGetEventProfilingInfo (event,CL_PROFILING_COMMAND_START, 
                                 sizeof(cl_ulong), &start_time,NULL);                                                                                                                                                                                           
  clGetEventProfilingInfo (event,CL_PROFILING_COMMAND_END, 
                                     sizeof(cl_ulong), &end_time,NULL);                                                                                                                                                                                                                                                                              
  double total_time = (end_time - start_time) * 1e-6;                                                                                                                                                                                                                                     
  return total_time;                                                                                                                                                                                                                                                                      
          

cl_event timer;

int ret = clEnqueueNDRangeKernel(cq, kernel, 1, p_global_work_offset, &global_work_size, 
                                          &local_work_size, 0, NULL, &timer); 

printf("T:%zu L:%zu T:%fms",global_work_size, local_work_size, getDuration(timer)); 

【讨论】:

【参考方案2】:

这是一个非常模糊的问题。

你的意思是只有内核而不加载数据吗?

内核要做什么,你在什么样的硬件上运行它,你的数据是如何组织的,你如何管理你的缓冲区?

一切都在全局内存中吗?你也在定义延迟吗?您需要最大化吞吐量吗?您要针对特定​​硬件进行优化吗?

对我来说有很多问题。

【讨论】:

以上是关于OpenCl 中的吞吐量计算的主要内容,如果未能解决你的问题,请参考以下文章

luogu P3171 [CQOI2015]网络吞吐量 |网络流最大流

luogu P3171 [CQOI2015]网络吞吐量 |网络流最大流

[BZOJ 3931][CQOI2015]网络吞吐量(SPFA+网络流)

P3171 [CQOI2015]网络吞吐量

分组交换中的时延,丢包和吞吐量

分组交换中的时延,丢包和吞吐量