0

我需要在OpenCL中长时间处理一些数据,并且由于时间限制(驱动程序自动重启)我多次使用不同的参数启动内核。每次它必须处理相同的数据,大约 50 Mb,所以我只想复制一次。我已经阅读了很多关于 OpenCL 的文章和教程,但不知道如何做到这一点,以保持执行之间的数据。

如果它很重要,我会为 OpenCL 使用 C# 绑定,称为 OpenCLTemplate。

4

4 回答 4

2

您存储在全局内存缓冲区中的任何数据都将保留在 GPU 上。你不需要做任何特别的事情。

于 2012-07-03T16:26:20.677 回答
0

为什么不能只为所有内核执行保留一个只读缓冲区并将结果放在不同的缓冲区中?

是什么让你认为你必须写入你正在读取的同一个缓冲区?

于 2012-07-01T23:34:12.020 回答
0

你有几个问题;

1)如何将 50MB 的数据传输到 GPU 2)在 Windows 上,当您运行长时间计算时,GPU 驱动程序会频繁重置 3)约 50MB 的持久性机制

可能的答案 1a) 创建一个 50M 的 OpenCL 内存缓冲区 1b) 将数据排队(写入)到 GPU 1c) 将内核 arg 设置到此缓冲区 1d) 作为内核 arg 访问 GPU 全局内存中的数据

2)当 OpenCL 驱动程序(图形)驱动程序重置时,您的应用程序将死机。您可以编写脚本在系统执行之前将其杀死,然后重新启动应用程序。该脚本应在终止应用程序之前回读中间结果。否则你永远无法控制。仅在 Windows 上使用 Nvida Tesla GPU 运行或在 Linux 上运行将避免 O/S 认为显示器无法正常工作并重置驱动程序。

3) 我会使用 MMAPed 文件来保存 50MB 的数据和任何中间结果。MMAPed 文件地址可用于为应用程序创建 OpenCL 缓冲区。

最后,我会质疑这种方法。在 Windows 和 Linux 上运行,由于驱动程序重置问题等等。即使使用 PostgreSQL 数据库和我自己的 PgOpenCL,我也找不到有效的解决方案来解决 Windows 上的驱动程序超时问题,这保证了所有 GPU 内核执行都是 ACID。

于 2012-07-03T21:15:29.833 回答
-1

正如我从在线阅读中了解到的那样,只能同时运行一个内核。这意味着您应该能够使用一组参数启动它,完成后可以启动一组新参数,然后在运行时您可以读出 50mb。

如果驱动程序重新启动 - 这可能是由于错误/异常?

于 2012-07-01T23:29:31.847 回答