2014-11-01 83 views
6

鉴于OpenCL旨在成为异构编程的API,几乎定义它具有与其相关的巨大延迟惩罚。因此必须有一个异步API。异步API

但是我发现很难在OpenCL.net中找到异步API。我找到了OpenCl.Net.Event结构,在大多数API调用中这似乎是一个out参数。不过,我无法找到关联该事件的回调,因为opencl.net似乎缺少clSetEventCallback

有没有人知道如何在opencl.netawait异步操作?

编辑:我讨厌人们downvote没有至少发表评论。对于这个记录,我已经围绕这个主题搜索了很多内容,目前我正在读一本关于OpenCL的书,甚至将源代码下载到OpenCL.net项目中也无济于事。 OpenCL.net上有很少的文档。

+0

你是什么意思等待时间?是否在等待结果时函数调用阻塞的时间? – Eric 2014-11-04 07:19:40

+0

例如在OpenCL中,您需要将数据加载到目标'设备'的内存中。这是通过排队加载内存操作完成的。示例代码展示了如何同步执行此操作(通过设置async false并忽略out事件对象)。从实现的角度来看,将数据加载到GPU上的速度“很慢”,因为延迟很高(即使我们只考虑了GDDR5延迟)。当我们通过PCI-E总线进行数百次往返GPU时,我们失去了所有的性能提升。因此,我希望能够排队操作并通知完成。 – Aron 2014-11-04 07:26:11

+0

我对openCl不是很熟悉,但不是我们正在谈论的openCl的批处理?你想要的是花尽可能多的时间排队数据,尽可能少的时间等待结果(或其他)是正确的? – Eric 2014-11-04 07:50:09

回答

1

我对OpenCL.net了解不多,但不是CommandQueue你在找什么?您可以使用Finish命令将所有异步任务排入队列,直到完成所有任务为止?

例如这里:GPGPU image processing basics using OpenCL.NET图像处理部分

对于clSetEventCallback我只找到clFinish或clWaitForEvents。

关于你声明:

,因为它似乎clSetEventCallback从opencl.net

失踪我找不到任何方式做你想做的,对不起。

编辑: 这似乎是非常intenstring:Google-Code/GPUTracer。你应该看看OpenCL.cs和Event.cs。我认为他们解决了你的问题。

+0

不幸的是,这不是我所期待的。我正在寻找如何在'Blocking'设置为'false'的情况下使用这些命令,这与我目前发现的每个教程都是相反的。本教程适用于阻塞/同步API。 – Aron 2014-11-06 15:46:49

+0

这是什么:https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html(clFinish)?对不起,如果我完全错了,只是试图帮助:) – BendEg 2014-11-06 15:52:41

+0

“阻塞,直到命令队列中以前排队的所有OpenCL命令都发布到相关设备并完成。”根据定义,它是异步的对立面。 – Aron 2014-11-06 15:53:43