我需要在OpenCL中长时间处理一些数据,并且由于时间限制(驱动程序自动重启),我使用不同的参数多次启动内核。每次它必须处理相同的数据,大约50 Mb,所以我只想复制一次。我已经阅读了很多关于OpenCL的文章和教程,但是不知道如何做到这一点,以便在执行之间保持数据。
如果这很重要,我使用C#绑定OpenCL名为OpenCLTemplate。
答案 0 :(得分:2)
存储在全局内存缓冲区中的任何数据都将保留在GPU上。你不需要做任何特别的事情。
答案 1 :(得分:0)
为什么不能为所有内核执行保留只读缓冲区并将结果放在不同的缓冲区中?
是什么让你认为你必须写入你正在阅读的同一个缓冲区?
答案 2 :(得分:0)
你有几个问题;
1)如何在GPU上获得50MB的数据 2)在Windows上,当您运行长计算时,GPU驱动程序将频繁复位 3)约50MB的持久性机制
可能的答案 1a)创建一个50M的OpenCL内存缓冲区 1b)将数据排队(写入)到GPU 1c)将内核arg设置为此缓冲区 1d)作为GPU全局内存中的内核arg访问数据
2)当OpenCL驱动程序(图形)驱动程序重置时,您的应用程序将会死亡。 您可以编写在系统执行之前将其杀死的脚本,然后重新启动应用程序。脚本应该在杀死应用程序之前回读中间结果。 否则你永远不会控制住。只运行Nvida Tesla GPU 在Windows上或在Linux上运行将避免O / S思维显示无法正常运行并重置驱动程序。
3)我会使用MMAPed文件来保存50MB的数据和任何中间结果。该 MMAPed文件地址可用于为应用程序创建OpenCL缓冲区。
最后,我将质疑这种方法。在Windows与Linux上运行,由于驱动程序重置问题等原因。即使使用PostgreSQL数据库和我自己的PgOpenCL,我也无法在Windows上找到解决驱动程序超时的有效解决方案,这可以保证所有GPU内核执行都是ACID。
答案 3 :(得分:-1)
正如我从在线阅读中所理解的那样,只有一个内核可以同时运行。这意味着您应该能够使用一组参数启动它,当完成一组新参数时,然后在运行时您可以读出50mb。
如果驱动程序重新启动 - 这可能是由于错误/异常引起的?