2D/3D CUDA 块如何划分为扭曲?

发布于 2024-11-10 11:42:22 字数 160 浏览 4 评论 0原文

如果我从一个块具有尺寸的网格开始我的内核:

dim3 block_dims(16,16);

网格块现在如何分割成扭曲?这样一个块的前两行是否形成一个扭曲,或者前两列,或者这是任意排序的?

假设 GPU 计算能力为 2.0。

If I start my kernel with a grid whose blocks have dimensions:

dim3 block_dims(16,16);

How are the grid blocks now split into warps? Do the first two rows of such a block form one warp, or the first two columns, or is this arbitrarily-ordered?

Assume a GPU Compute Capability of 2.0.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一腔孤↑勇 2024-11-17 11:42:22

线程在块内按顺序编号,以便 threadIdx.x 变化最快,然后 threadIdx.y 变化第二快,threadIdx.z变化最慢。这在功能上与多维数组中的列主要排序相同。扭曲是按此顺序从线程顺序构造的。因此 2d 块的计算为

unsigned int tid = threadIdx.x + threadIdx.y * blockDim.x;
unsigned int warpid = tid / warpSize;

这在编程指南和 PTX 指南中都有介绍。

Threads are numbered in order within blocks so that threadIdx.x varies the fastest, then threadIdx.y the second fastest varying, and threadIdx.z the slowest varying. This is functionally the same as column major ordering in multidimensional arrays. Warps are sequentially constructed from threads in this ordering. So the calculation for a 2d block is

unsigned int tid = threadIdx.x + threadIdx.y * blockDim.x;
unsigned int warpid = tid / warpSize;

This is covered both in the programming guide and the PTX guide.

宣告ˉ结束 2024-11-17 11:42:22

为了通过两个连续扭曲的“Visual Studio WarpWatch”窗口说明 @talonmies 的答案(dim3 block_dims(16,16); 和 WarpSize = 32):

第一扭曲第二次变形

To illustrate @talonmies's answer through 'Visual Studio WarpWatch' window for two consecutive warps (dim3 block_dims(16,16); and WarpSize = 32):

First WarpSecond Warp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文