CUDA中的顺序编程

时间:2016-04-19 02:04:41

标签: c++ cuda

我想在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()中找到了一些关于动态并行的信息,并且相信它可能很有用,但无论如何仍然不知道如何在内核中实现这个循环。我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

上面的评论是正确的,即使使用纯顺序实现,您也需要复制数据。这可能是你的内核(没有内存管理代码或任何进一步的细节):

   __global__ void update(...)
    for(int i = threadIdx.x + blockDim.x * blockIdx.x; i <= N; i += blockDim.x * gridDim.x)
{
    for(int j = threadIdx.y + blockDim.y * blockIdx.y; j <= N; j += blockDim.y * gridDim.y)
    {
        output[i,j] = update_func(input, i, j);
    }
}

你可以使用

调用(来自主机)
update<<<dim3(16, 16), dim3(64, 64)>>>(input, output, width, height);

用适合你的硬件的任何值替换发射界限