clWaitForEvents上的分段错误

时间:2018-06-05 13:49:41

标签: events segmentation-fault opencl

我试图通过构建我自己的例子并使用它们来理解OpenCL。所以现在我有简单的内核和两个应该执行它的工作项,但是我可以总结两个工作项的结果。为此,我使用了屏障功能:

kernel void parallel_operation(__global ulong *val) {
    size_t i = get_global_id(0);
    local unsigned int result[2] = { 0 };
    for (ulong k = 0; k < 100; k++) {
        for (ulong j = 0; j < 10000; j++) {
            result[i] += (j * 3) % 5;
        }
    }
    barrier(CLK_LOCAL_MEM_FENCE);
    if (i == 0) {
        *val = result[0] + result[1];
    }
}

我还想测量这些工作项完成所需的时间,因此我正在使用事件:

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

ret = clFlush(command_queue);
ret = clFinish(command_queue);
clWaitForEvents(1, &events);

当我运行代码时,我在clWaitForEvents(1,&amp; events)中遇到分段错误。起初我以为是因为有两个工作项,所以可能有两个事件,但我找不到这样的例子。我也尝试过两次clWaitForEvent调用,但它没有用。

所以我想我的问题是,我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

clEnqueueNDRangeKernel的最后一个参数是单个事件,而不是事件列表。

规范允许在某些情况下为NULL:

  

如果event为NULL,则不会为此内核执行实例创建任何事件,因此应用程序无法查询或排队等待此特定内核执行实例。

也许这就是这里发生的事情。 我建议您检查ret代码中的早期通用失败,然后在调用event 之前检查clWaitForEvents是否为NULL。