如果我有2D矢量的序列(或流),并且我想为每个2D矢量使用一个线程,我可以为每个矢量分配一个块,每个块分配一个线程吗?我必须先将其转换为一维数组吗?或者唯一的线程可以通过blockIdx.x和blockIdx.y访问向量元素?
什么是内核启动参数?
假设vsize = 2D向量的数量(我想将其用作块数)
这是正确的:
mykernel<<vsize,1>>()
每个向量的计算是独立的。 我的设备计算能力是2.1
答案 0 :(得分:2)
是的,您可以使用CUDA为每个块启动一个线程。通常不是你如何从机器中获得性能,因为当一个线程正在运行时,它会使大约97%的执行资源空闲。
如果要为每个块启动一个线程,这是正确的语法:
mykernel<<<gridsize, 1>>>(...);
其中gridsize
是您要启动的每个网格的块数。每个块使用一个线程通常用于向新程序员引入CUDA,但通常不应该用于面向性能的代码。
在上述情况下,每个块都将使用单个线程启动,并且该线程将具有全部为零的线程索引(threadIdx.x
,threadIdx.y
和threadIdx.z
)。块索引(blockIdx.x
等)将由您的gridsize
变量确定。