我试图通过构建我自己的例子并使用它们来理解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调用,但它没有用。
所以我想我的问题是,我在这里做错了什么?
答案 0 :(得分:1)
clEnqueueNDRangeKernel的最后一个参数是单个事件,而不是事件列表。
规范允许在某些情况下为NULL:
如果event为NULL,则不会为此内核执行实例创建任何事件,因此应用程序无法查询或排队等待此特定内核执行实例。
也许这就是这里发生的事情。 我建议您检查ret
代码中的早期通用失败,然后在调用之前检查event
clWaitForEvents
是否为NULL。