【发布时间】:2016-08-10 23:23:59
【问题描述】:
我想在 CUDA 中实现这个简单的循环。
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
x[i, j] = (x0[i, j] + a*(x[i - 1, j] + x[i + 1, j] + x[i, j - 1] + x[i, j + 1])) / c;
}
}
问题是:计算例如X[i,j] 我需要知道 X[i-1,j] 和 X[i,j-1] 的新值,如果我想在 CPU 上计算它很容易(计算是连续的)。但是 GPU 正在并行计算所有内容,因此从 CPU 和 GPU 收到的结果是不同的。我在 CUDA 和 cudaDeviceSynchronize() 中找到了一些关于动态并行的信息,并相信它可能很有用,但无论如何仍然不知道如何在内核中实现这个循环。我会很感激你的帮助。
【问题讨论】:
-
您想实现过滤器吗?如果是这样,您的 CPU 代码是错误的。您应该在计算之前复制源数据
-
考虑到您正在访问可能已被另一个线程并行修改的数据(似乎您正在实现某种过滤器),最简单的解决方法是从一个缓冲区读取值(例如“输入“)并将您的计算写入另一个(因此“输出”)。这就是我做一些需要相邻像素值的过滤器的方式,例如模糊或中值。
-
不,它不是过滤器,它是来自液体模拟器的线性方程求解器(由 Stam 提供)。我现在的目标是将他的代码更改为 GPU 代码。但你的建议可能是正确的......所以我应该复制输入数据然后......不,我猜它仍然是并行的。我需要像 CPU 版本一样按顺序制作。