异步API

6
考虑到OpenCL旨在成为异构编程的API,几乎可以定义它与巨大的延迟惩罚相关。因此,必须为其提供异步API。
然而,在OpenCL.net中找到异步API似乎有些困难。我已经找到了OpenCl.Net.Event结构体,它似乎是大多数API调用中的out参数。但是,我找不到任何方法将回调与事件关联起来,因为clSetEventCallback在opencl.net中缺失。
有人知道如何在opencl.net中等待异步操作吗?

延迟是什么意思?它是指函数调用在等待结果时阻塞的时间吗? - Eric
例如在OpenCL中,您需要将数据加载到目标“设备”的内存中。这是通过排队加载内存操作来完成的。示例代码展示了如何同步执行此操作(通过设置async为false,并忽略“out”“Event”对象)。从实现的角度来看,将数据加载到GPU上是“慢”的,因为延迟很高(即使我们只考虑GDDR5延迟)。当我们通过PCI-E总线进行数百次往返到GPU时,我们失去了所有性能增益。因此,我希望能够排队操作并收到完成通知。 - Aron
我对openCl不是很熟悉,但我们讨论的不是openCl的批处理吗?你想要的是尽可能多地排队数据,尽可能少地等待结果(或其他任何事情),对吧? - Eric
@Eric 批处理肯定是值得做的事情。但考虑到需要执行几个操作(加载数据/加载内核(计算)/刷新操作/等待完成/将数据导出回 RAM),异步仍然很重要。 - Aron
@Lukazoid 很棒。谢谢。 - Aron
显示剩余2条评论
1个回答

1
我不太了解OpenCL.net,但是你需要的不是CommandQueue吗?您可以使用Finish命令将所有异步任务排队执行,直到所有任务完成为止。例如,在使用OpenCL.NET进行GPGPU图像处理基础知识下的图像处理部分中。

对于clSetEventCallback,我只找到了clFinish或clWaitForEvents。

关于您的声明:

似乎opencl.net缺少clSetEventCallback

很抱歉,我找不到任何实现您要求的方法的方式。

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


很遗憾,这不是我正在寻找的内容。我正在寻找如何使用那些将“Blocking”设置为“false”的命令,这与我迄今为止找到的每个教程都相反。这个教程是用于执行阻塞/同步API的。 - Aron
这是什么意思:https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clFinish.html(clFinish)?如果我完全错了,对不起,只是想帮忙 :) - BendEg
阻塞直到命令队列中所有先前排队的OpenCL命令被发出到相关设备并完成。根据定义,这是异步操作的相反。 - Aron
好的,但我不理解你问题中的这一部分:“有人知道如何在opencl.net中等待异步操作吗?” - BendEg
1
@Aron,好的,现在我明白了并更新了我的帖子,但是我没有找到任何使用当前版本的OpenCL.Net的解决方案,抱歉。 - BendEg
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接