0

对于我正在处理的问题,我需要解决两个子问题:NxM 网格上的 Sub1 和 Kx1 网格上的 Sub2。问题是,这些子问题应该在解决过程的每一步之后进行沟通,所以我需要同时运行它们。

最终结果应如下所示:

  1. Sub1 求解时间 t
  2. Sub2 求解时间 t
  3. 计算时间 t+1 的 sub1 和 sub2 之间的交互项

然后使用新计算的交互项对 t+1 重复此操作,然后对 t+2、t+3 等重复此操作。使用的所有数据都存储在全局设备内存中,因此无需复制到并从步骤之间的设备。

我的问题是,我如何告诉 OpenCL 我想同时处理两个不同大小的问题?

4

1 回答 1

1

真的需要“同时”吗?

这是对 OpenCL 和并行系统的常见误解。越来越多的并行化和所有并行运行并不总是一个好的选择。事实上,99% 的情况不需要并行(除非存在一些时间限制),并且强制这样做会减慢速度。

Sub1根据 和 的大小和工作量Sub2

  • 如果它需要很少的时间或适用于很少的数据量:
    1. 将两者合并到一个流程中,并根据需要扩展工作项。其中一些会闲置,但损失很小,将通过和 之间的本地/私有内存共享来Sub1补偿Sub2
  • 如果它们是大块的处理。
    1. 将两个进程拆分为 2-3 个不同的内核、不同的参数等。
    2. 使用全局变量来通信这两个进程
    3. 启动 2 个不同大小的内核(为了完全适合工作量)
    4. 当两者都完成后,在结果上启动另一个内核,以生成新的迭代数据。
    5. 您甚至可以在队列中一次启动所有内容,它们将按顺序启动而无需 CPU 干预。这是更简单的方法。

我会说在你的情况下,你应该选择很多内核。

于 2013-10-08T11:58:04.280 回答