CUDA中的顺序编程

Sequential programing in CUDA

本文关键字:编程 顺序 CUDA      更新时间:2023-10-16

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

上面的

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

   __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);

用适合您的硬盘的任何值替换启动边界