2

使用带有 JOCL 绑定的 AMD APP OpenCL 实现,我正在尝试使用 Java 自动资源管理创建一个通用括号分析器。基本思想是:

class Timer implements AutoCloseable {
    ...
    Timer { 
        ...
        clEnqueueMarker( commandQueue, startEvent );
    }

    void close() {
        cl_event stopEvent = new cl_event();
        clEnqueueMarker( commandQueue, stopEvent );
        clFinish( commandQueue );
        ... calculate and output times ...
    } 
}

我的问题是标记命令事件(stopEvent 和 startEvent)的分析信息不可用。尽管 a) 在命令队列上设置了 CL_QUEUE_PROFILING_ENABLE 并且 b) 在命令队列上刷新和等待并验证停止和启动事件是 CL_COMPLETE 且没有错误。

所以我的问题是,AMD OpenCL 中的标记命令是否支持分析?如果不是,规范是否明确禁止(我没有发现任何这种影响)?谢谢。

4

2 回答 2

2

我已经重新检查了规范,在我看来你得到的东西是正常的(尽管我以前从未关注过这个细节)。在关于分析的第 5.12 节中,标准规定:

本节介绍作为命令排队到命令队列的 OpenCL 函数的分析。所指的具体函数有:clEnqueue{Read|Write|Map}Buffer, clEnqueue{Read|Write}BufferRect, clEnqueue{Read|Write|Map}Image, clEnqueueUnmapMemObject, clEnqueueCopyBuffer, clEnqueueCopyBufferRect, clEnqueueCopyImage, clEnqueueCopyImageToBuffer, clEnqueueCopyBufferToImage, clEnqueueNDRangeKernel, clEnqueueTask 和 clEnqueueNativeKernel。

所以 clEnqueueMarker() 函数不在列表中,我猜返回的 CL_PROFILING_INFO_NOT_AVAILABLE 值是有道理的。

于 2013-06-17T10:14:52.883 回答
1

我刚试过这个,它现在似乎工作了。在 Windows 10 上使用 AMD 7870 和在 Linux 上使用 Nvidias Titan Black 和 Titan X 卡进行测试。

OpenCL 1.2 规范仍然包含引用的 @CaptainObvious 段落。该clEnqueueMarker功能仍然缺失,但我可以毫无问题地获取分析信息。

标记事件的开始时间和结束时间总是相等的,这很有意义。

顺便提一句。在 OpenCL 1.2 中已弃用,clEnqueueMarker应替换为.clEnqueueMarkerWithWaitList

于 2016-09-07T19:15:38.600 回答