【发布时间】:2015-01-08 00:24:48
【问题描述】:
我是 openCL 的新手,愿意比较 C 代码和 openCL 内核之间的性能提升。
在将性能与 C 参考代码进行比较时,有人可以详细说明这两种方法中哪种方法更好/更正确地分析 openCL 代码:
-
使用 QueryPerformanceCounter()/__rdtsc() 循环(在 getTime 函数中调用)
ret |= clFinish(command_queue); //Empty the queue getTime(&begin); ret |= clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, global_ws, NULL, 0, NULL, NULL); //Profiling Disabled. ret |= clFinish(command_queue); getTime(&end); g_NDRangePureExecTimeSec = elapsed_time(&begin, &end); //Performs: (end-begin)/(CLOCK_PER_CYCLE*CLOCK_PER_CYCLE*CLOCK_PER_CYCLE) -
使用事件分析:
ret = clEnqueueMarker(command_queue, &evt1); //Empty the Queue ret |= clEnqueueNDRangeKernel(command_queue, kernel, 2, NULL, global_ws, NULL, 0, NULL, &evt1); ret |= clWaitForEvents(1, &evt1); ret |= clGetEventProfilingInfo(evt1, CL_PROFILING_COMMAND_START, sizeof(cl_long), &begin, NULL); ret |= clGetEventProfilingInfo(evt1, CL_PROFILING_COMMAND_END, sizeof(cl_long), &end, NULL); g_NDRangePureExecTimeSec = (cl_double)(end - begin)/(CLOCK_PER_CYCLE*CLOCK_PER_CYCLE*CLOCK_PER_CYCLE); //nSec to Sec ret |= clReleaseEvent(evt1);
此外,我没有使用专用显卡,而是将 Intel HD 4600 集成显卡用于以下 openCL 代码:
__kernel void filter_rows(__global float *ip_img,\
__global float *op_img, \
int width, int height, \
int pitch,int N, \
__constant float *W)
{
__private int i=get_global_id(0);
__private int j=get_global_id(1);
__private int k;
__private float a;
__private int image_offset = N*pitch +N;
__private int curr_pix = j*pitch + i +image_offset;
// apply filter
a = ip_img[curr_pix-8] * W[0 ];
a += ip_img[curr_pix-7] * W[1 ];
a += ip_img[curr_pix-6] * W[2 ];
a += ip_img[curr_pix-5] * W[3 ];
a += ip_img[curr_pix-4] * W[4 ];
a += ip_img[curr_pix-3] * W[5 ];
a += ip_img[curr_pix-2] * W[6 ];
a += ip_img[curr_pix-1] * W[7 ];
a += ip_img[curr_pix-0] * W[8 ];
a += ip_img[curr_pix+1] * W[9 ];
a += ip_img[curr_pix+2] * W[10];
a += ip_img[curr_pix+3] * W[11];
a += ip_img[curr_pix+4] * W[12];
a += ip_img[curr_pix+5] * W[13];
a += ip_img[curr_pix+6] * W[14];
a += ip_img[curr_pix+7] * W[15];
a += ip_img[curr_pix+8] * W[16];
// write output
op_img[curr_pix] = (float)a;
}
以及用于按列处理的类似代码。我使用方法 1 观察到增益(openCL Vs 优化矢量化 C-Ref)大约 11 倍,使用方法 2 大约 16 倍。 但是,我注意到有人声称使用专用显卡时的增益大约为 200-300 倍。
所以我的问题是:
- 如果我在专用显卡上运行相同的代码,我可以获得多大的收益。会是类似的订单还是显卡会胜过英特尔高清显卡?
- 我能否将 WARP 和线程概念从 CUDA 映射到英特尔高清显卡(即并行执行的线程数)?
【问题讨论】:
标签: c performance optimization profiling opencl