C++ 了解索引和一个块中有多少线程

C++ 了解索引和一个块中有多少线程,c++,cuda,gpu,C++,Cuda,Gpu,我正在研究cuda编程,我发现索引网格的方法不止一种 我不明白的是,这些索引技术之间是如何不同的 这些是我的索引: 一维块的一维网格 th=blockIdx.x *blockDim.x + threadIdx.x; 二维块的一维网格 th=blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x; 三维块的一维网格 th =blockIdx.x * blockDim.x * blockDim.y

我正在研究cuda编程,我发现索引网格的方法不止一种

我不明白的是,这些索引技术之间是如何不同的

这些是我的索引:

一维块的一维网格

th=blockIdx.x *blockDim.x + threadIdx.x;
二维块的一维网格

th=blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
三维块的一维网格

th =blockIdx.x * blockDim.x * blockDim.y * blockDim.z + threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;
与第一种索引相比,使用第二种索引的优点是什么

我在阅读这些信息时也遇到了问题: 每个螺纹块的最大螺纹数为1024,螺纹块(x,y,z)的最大尺寸为(10241024,64)
blockdim.z等于64是什么意思?只有64个线程或1024*64?如果我使用所有方向怎么办?我可以在网格中使用的线程数量增加了吗?

索引反映了您希望如何在线程之间对数据进行逻辑分区。 如果你正在处理一个一维问题(想象一下计算两个向量的和),那么你同意我的观点,使用一维分解更容易,因此你可以很容易地将一个线程映射到两个输入数组中的一对元素

如果正在处理二维和三维结构(如矩阵),同样的参数也适用


关于第二个关于最大线程数的问题。您可以使用尺寸(x,y,z)计算块中的线程数为
x*y*z
。每个块允许的最大线程数为
1024
。这意味着您可以使用
x,y,z
的所有值,前提是他们的产品不高于
1024
,并且
x,yAs已经回答:这只是为了您的利益。我处理3D图像,因此使用3D线程块来安排一切非常方便,因为我可以在每个方向上计算线程
id
,并将其用于索引。我现在看的是:网格大小的最大尺寸(x,y,z):(2147483647,65535,65535)阅读此内容和问题中的其他内容是否意味着我可以创建一个唯一的网格,其总块数=2147483647(始终考虑xyz)