在计时多个工作项时,我是否需要更多活动?

时间:2018-06-14 13:30:19

标签: opencl nvidia gpgpu

如果我有多个工作项来执行某些内核代码,我是否需要有更多事件来跟踪每个工作项的执行时间?

我有一些奇怪的结果,1个工作项需要大约4秒才能执行,100个工作项也需要大约4秒才能执行。我无法看到这是如何可能的,因为我的Nvidia GeForce GT 525M只有2个计算单元,每个计算单元有48个处理元件。这让我相信我在clEnqueueNDRangeKernel中作为参数列出的事件只跟踪一个工作项。这是真的,如果是这样,我怎样才能让它跟踪所有的工作项?

这是Khronos用户指南中关于clEnqueueNDRangeKernel中的事件参数的说法:

  

event 返回一个标识此特定内核执行实例的事件对象

"这个特定的内核执行实例"是什么意思?不是一个单一的工作项目吗?

编辑: 相关主持人代码:

static const size_t numberOfWorkItems = 48;
const size_t globalWorkSize[] = { numberOfWorkItems, 0, 0 };

cl_event events;
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, globalWorkSize, NULL, 0, NULL, &events);
ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0, sizeof(cl_mem), val, 0, NULL, NULL);

clWaitForEvents(1, &events);
cl_ulong time_start;
cl_ulong time_end;

clGetEventProfilingInfo(events, CL_PROFILING_COMMAND_QUEUED, sizeof(cl_ulong), &time_start, NULL);
clGetEventProfilingInfo(events, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &time_end, NULL);

double nanoSeconds = (double) (time_end - time_start);
printf("OpenCl Execution time is: %f milliseconds \n",nanoSeconds / 1000000.0);
printf("Result: %lu\n", val[0]);

内核代码:

kernel void parallel_operation(__global ulong *val) {
    size_t i = get_global_id(0);
    int n = 48;
    local unsigned int result[48];
    for (int z = 0; z < n; z++) {
        result[z] = 0;
    }
    // here comes the long operation
    for (ulong k = 0; k < 2000; k++) {
        for (ulong j = 0; j < 10000; j++) {
            result[i] += (j * 3) % 5;
        }
    }
    barrier(CLK_LOCAL_MEM_FENCE);
    if (i == 0) {
        for (int z = 1; z < n; z++) {
            result[0] += result[z];
        }
        *val = result[0];
    }
}

1 个答案:

答案 0 :(得分:2)

您正在测量整个内核函数的执行时间。或者换句话说,第一个工作项开始和最后一个工作项之间的时间结束。据我所知,无法测量OpenCL中单个工作项的执行时间。