gpt4 book ai didi

cuda - 理解CUDA网格维度、 block 维度和线程组织(简单解释)

转载 作者:行者123 更新时间:2023-12-03 04:20:30 27 4
gpt4 key购买 nike

如何组织线程以由 GPU 执行?

最佳答案

硬件

例如,如果 GPU 设备有 4 个多处理单元,并且每个单元可以运行 768 个线程:那么在给定时刻,真正并行运行的线程不会超过 4*768 个(如果您计划更多线程,它们将等待轮到他们)。

软件

线程以 block 的形式组织。 block 由多处理单元执行。 block 的线程可以使用 1Dimensions(x)、2Dimensions (x,y) 或 3Dim 索引 (x,y,z) 来标识(索引),但在任何情况下 xyz <= 768对于我们的示例(其他限制适用于 x、y、z,请参阅指南和您的设备功能)。

显然,如果您需要超过 4*768 个线程,则需要超过 4 个 block 。 block 也可以按 1D、2D 或 3D 索引。有一个 block 队列等待进入GPU(因为在我们的示例中,GPU 有 4 个多处理器,并且只有 4 个 block 同时执行)。

现在是一个简单的案例:处理 512x512 图像

假设我们希望一个线程处理一个像素 (i,j)。

我们可以使用每个 64 个线程的 block 。那么我们需要 512*512/64 = 4096 block (所以有 512x512 线程 = 4096*64)

通常将线程组织在 blockDim = 8 x 8(每个 block 64 个线程)的 2D block 中(以便更轻松地索引图像)。我更喜欢将其称为threadsPerBlock。

dim3 threadsPerBlock(8, 8);  // 64 threads

和 2D gridDim = 64 x 64 block (需要 4096 block )。我更喜欢称之为 numBlocks。

dim3 numBlocks(imageWidth/threadsPerBlock.x,  /* for instance 512/8 = 64*/
imageHeight/threadsPerBlock.y);

内核是这样启动的:

myKernel <<<numBlocks,threadsPerBlock>>>( /* params for the kernel function */ );       

最后:会有类似于“4096 个 block 的队列”的内容,其中一个 block 正在等待分配给 GPU 的多处理器之一以执行其 64 个线程。

在内核中,线程要处理的像素(i,j)是这样计算的:

uint i = (blockIdx.x * blockDim.x) + threadIdx.x;
uint j = (blockIdx.y * blockDim.y) + threadIdx.y;

关于cuda - 理解CUDA网格维度、 block 维度和线程组织(简单解释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2392250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com