我正在研究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?如果我全方向使用该怎么办?可在网格中使用的线程数会增加吗?
答案 0 :(得分:3)
索引反映了您如何在线程之间逻辑分区数据。 如果您正在处理一维问题(想象一下计算两个向量的和),那么您同意我的观点,即使用一维分解要容易得多,因此您可以轻松地将一个线程从两个输入映射到一对元素数组。
如果您正在处理2D和3D结构(如矩阵),则应用相同的参数。
关于第二个关于最大线程数的问题。您可以计算尺寸为(x,y,z)为import { useCallback } from 'react'
const handleClickOpen = useCallback(() => {
setOpen(true)
}, [])
的块中的线程数。每个块允许的最大线程数为x*y*z
。这意味着您可以使用1024
所需的所有值,只要它们的乘积不高于x,y,z
且1024
和x,y<=1024
即可。