我们什么时候需要 CUDA 中的二维线程?
When do we need two dimension threads in CUDA?
我想知道我们什么时候应该在 CUDA 中为线程使用 x 和 y 坐标?我看过一些嵌套循环的代码,它们使用 x 和 y 坐标。有什么通用规则吗?谢谢
标题中问题的答案很简单:从不。你从来真的需要二维坐标。
但是,它们实际存在的原因有多种。主要原因之一是它简化了某些问题的建模。特别是,由于 "historical" 原因,GPU 是 "good at" 或它们已被用于解决的问题。我在这里考虑图像处理或矩阵运算之类的事情。当您可以清楚地说:
时,编写图像处理或矩阵乘法 CUDA 内核会更加直观
int pixelX = threadIdx.x + blockIdx.x * blockDim.x;
int pixelY = threadIdx.y + blockIdx.y * blockDim.y;
从那以后只处理简单的像素坐标。 多少 这实际上简化了索引麻烦,当涉及共享内存时变得更加明显,例如,在矩阵乘法期间,并且您想要 slice-and-dice 一组行+从更大的矩阵中提取列,将其复制到本地内存。如果您只有 1D 索引并且必须 fiddle 使用偏移量和步幅,这将很容易出错。
CUDA 实际上不仅支持 2D,而且还支持 3D 内核这一事实可能源于 3D 纹理经常用于 Volume Rendering 之类的东西,这也可以大大加速GPU(包括 "volume ray casting" 等关键字的网络搜索将引导您在此处找到一些不错的演示)。
(旁注:在 OpenCL 中,这个想法甚至被推广了。虽然 CUDA 只支持 1D、2D 和 3D 内核,但在 OpenCL 中,你只有 ND kernels,其中 N 作为 work_dim
参数明确给出)
(另注:我很确定还有更多 low-level 技术原因与 GPU 的硬件架构或视频内存的缓存有关,其中2D 内核的位置可能很容易被利用并且对整体性能有益 - 但我对此并不熟悉,所以这只是一个猜测直到现在)
我想知道我们什么时候应该在 CUDA 中为线程使用 x 和 y 坐标?我看过一些嵌套循环的代码,它们使用 x 和 y 坐标。有什么通用规则吗?谢谢
标题中问题的答案很简单:从不。你从来真的需要二维坐标。
但是,它们实际存在的原因有多种。主要原因之一是它简化了某些问题的建模。特别是,由于 "historical" 原因,GPU 是 "good at" 或它们已被用于解决的问题。我在这里考虑图像处理或矩阵运算之类的事情。当您可以清楚地说:
时,编写图像处理或矩阵乘法 CUDA 内核会更加直观int pixelX = threadIdx.x + blockIdx.x * blockDim.x;
int pixelY = threadIdx.y + blockIdx.y * blockDim.y;
从那以后只处理简单的像素坐标。 多少 这实际上简化了索引麻烦,当涉及共享内存时变得更加明显,例如,在矩阵乘法期间,并且您想要 slice-and-dice 一组行+从更大的矩阵中提取列,将其复制到本地内存。如果您只有 1D 索引并且必须 fiddle 使用偏移量和步幅,这将很容易出错。
CUDA 实际上不仅支持 2D,而且还支持 3D 内核这一事实可能源于 3D 纹理经常用于 Volume Rendering 之类的东西,这也可以大大加速GPU(包括 "volume ray casting" 等关键字的网络搜索将引导您在此处找到一些不错的演示)。
(旁注:在 OpenCL 中,这个想法甚至被推广了。虽然 CUDA 只支持 1D、2D 和 3D 内核,但在 OpenCL 中,你只有 ND kernels,其中 N 作为 work_dim
参数明确给出)
(另注:我很确定还有更多 low-level 技术原因与 GPU 的硬件架构或视频内存的缓存有关,其中2D 内核的位置可能很容易被利用并且对整体性能有益 - 但我对此并不熟悉,所以这只是一个猜测直到现在)