了解索引以及一个块中有多少个线程

时间:2019-06-07 09:52:13

标签: c++ cuda gpu

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

我不了解的是索引技术之间的差异。

这些是我的索引:

一维块的一维网格

th=blockIdx.x *blockDim.x + threadIdx.x;

2D块的1D网格

th=blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;

3D块的1D网格

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)的最大尺寸为(1024,1024,64)” blockdim.z等于64是什么意思?只有64个线程或1024 * 64?如果我全方向使用该怎么办?可在网格中使用的线程数会增加吗?

1 个答案:

答案 0 :(得分:3)

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

如果您正在处理2D和3D结构(如矩阵),则应用相同的参数。

关于第二个关于最大线程数的问题。您可以计算尺寸为(x,y,z)为import { useCallback } from 'react' const handleClickOpen = useCallback(() => { setOpen(true) }, []) 的块中的线程数。每个块允许的最大线程数为x*y*z。这意味着您可以使用1024所需的所有值,只要它们的乘积不高于x,y,z1024x,y<=1024即可。

相关问题