【问题标题】:Non blocking kernel launches in OpenCL intel implementation在 OpenCL 英特尔实现中启动非阻塞内核
【发布时间】:2019-07-30 23:42:13
【问题描述】:

我有以下骨架代码

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,
            &global_item_size,NULL,0, NULL, NULL);

printf("print immediately\n ");

我想到并在某处读到 clEnqueueNDRangeKernel 是非阻塞调用,并且 cpu 在将内核入队后立即继续执行。

但我看到了不同的行为。 printf 语句在内核完成执行后执行。为什么我会看到这种行为?如何使任何内核调用非阻塞?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    是的,clEnqueueNDRangeKernel() 应该是非阻塞的。但是,您显示的代码不允许明确得出内核在 printf 语句之前完成的结论。有几种可能:

    • 内核未正确排队或无法运行。您需要检查返回值ret是否为CL_SUCCESS,如果不是,请修复需要修复的部分,然后重试。
    • 内核运行速度快,运行内核的线程很可能被优先考虑,这样printf语句最终会在内核完成后执行。
    • 内核实际上在printf 语句期间运行,因为您的代码中没有任何内容可以让您得出其他结论。要检查内核是否正在运行或完成,您需要使用事件。例如:
    cl_event evt = NULL;
    cl_int ret, evt_status;
    // ...
    ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,
                &global_item_size, NULL, 0, NULL, &evt);
    // Check if it's finished or not
    if (ret == CL_SUCCESS)
    {
        clGetEventInfo(evt, CL_EVENT_COMMAND_EXECUTION_STATUS,
                 sizeof(cl_int), (void*) &evt_status, NULL);
        if (evt_status == CL_COMPLETE)
            printf("Kernel is finished\n");
        else
            printf("Kernel is NOT finished\n");
    }
    else
    {
        printf("Something's wrong: %d\n", ret);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多