在 clWaitForEvents 处发生分段错误



我试图通过构建自己的示例并尝试使用它们来理解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, &events( 处出现分段错误。起初我以为这是因为有两个工作项,所以可能有两个事件,但我找不到这种情况的示例。我还尝试做两个clWaitForEvent调用,但没有用。

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

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

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

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

也许这就是这里正在发生的事情。 我建议您检查ret代码是否存在早期的泛型故障,然后在调用clWaitForEvents之前检查event是否为 NULL

相关内容

  • 没有找到相关文章

最新更新