首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCL -迭代更新GPU驻留缓冲区?

OpenCL -迭代更新GPU驻留缓冲区?
EN

Stack Overflow用户
提问于 2011-05-04 15:21:04
回答 2查看 1.9K关注 0票数 3

我需要一个OpenCL内核迭代更新缓冲区并返回结果。澄清:

kernel

  • Kernel/worker向
  1. 发送初始缓冲区到内容以更新缓冲区
  2. 主机代码中的每个元素,希望是异步读取结果,但我不确定如何在不阻塞内核的情况下这样做。
  3. 内核再次运行,再次更新每个元素,但新值取决于前面的值。
  4. 重复某些固定次数的迭代。

<代码>G 211

到目前为止,我已经能够通过提供一个输入和输出缓冲区,在内核完成执行时将输出复制回输入,并重新启动内核来伪造它。这似乎是巨大的浪费时间和滥用有限的内存带宽,因为缓冲区相当大(~1GB)。

有什么建议/例子吗?我在OpenCL非常新,所以这可能有一个非常简单的答案。

如果有关系,我在NVidia GTX460和两个GTX295s上使用Cloo/OpenCL.NET。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-04 16:11:39

您可以将初始数据写入设备,并使用内核更改其内容。一旦内核完成了它的迭代,您就可以读取相同的内存缓冲区,并为下一次迭代重新启动内核。数据可以保存在OpenCL设备上。没有必要再把它发送到设备上。

据我所知,没有办法使主机和设备之间的工作同步。您只能启动内核等待并返回它。然后再读一遍结果,然后重新开始。异步读取将是危险的,因为您可能得到不一致的结果。

票数 2
EN

Stack Overflow用户

发布于 2011-05-06 12:23:18

我建议你在设备中创建一个cl_mem。把数据复制到那里。并使用内核进行迭代。使用相同的内存来存储结果,这对您来说更容易,因为您的内核只有一个参数。

然后,只需将数据复制到cl_mem,并运行内核即可。然后,从设备中提取数据,然后再次运行内核。

如果您不关心这个迭代是否可以获得下一个迭代中的一些数据。您可以大大提高性能、设计事件和OUT_OF_ORDER_QUEUE。这样,当您将数据复制回来时,内核可以运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5885793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档