【发布时间】:2017-04-03 12:01:07
【问题描述】:
我编写了模拟简单热流的 C++ 应用程序。它使用 OpenCL 进行计算。 OpenCL 内核采用二维 (n x n) 温度值数组及其大小 (n)。它在每个循环后返回带有温度的新数组:
伪代码:
int t_id = get_global_id(0);
if(t_id < n * n)
{
m_new[t_id / n][t_id % n] = average of its and its neighbors (top, bottom, left, right) temperatures
}
如您所见,每个线程都在计算矩阵中的单个单元格。当宿主应用程序需要执行 X 个计算周期时,它看起来像这样
- 对于 1 ... X
- 将内存复制到 OpenCL 设备
- 调用内核
- 将内存复制回来
我想重写内核代码以执行所有 X 周期,而无需在 OpenCL 设备之间进行持续的内存复制。
- 将内存复制到 OpenCL 设备
- 调用内核 X 次或调用内核一次并使其计算 X 个周期。
- 将内存复制回来
我知道内核中的每个线程都应该在所有其他线程都在执行它们的工作时锁定,然后 - m[][] 和 m_new[][] 应该交换。我不知道如何实现这两个功能。
或者也许有另一种最佳方式来做到这一点?
【问题讨论】:
标签: c++ multithreading opencl