OpenCl中的吞吐量计算

时间:2018-07-28 20:32:33

标签: opencl open-closed-principle opencl-c

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

2 个答案:

答案 0 :(得分:0)

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)); 

答案 1 :(得分:0)

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

您是说仅内核而不加载数据吗?

内核将执行什么操作,您在哪种硬件上运行,如何组织数据,如何管理缓冲区?

所有内容都在全局内存中吗?您还在定义延迟吗?您需要最大化吞吐量吗?您要针对特定​​硬件进行优化吗?

对我来说,许多问题浮出水面。