Cuda 块中的线程数

Cuda 块中的线程数,cuda,Cuda,我使用x和y计算设备中矩阵的单元。 当我对lenA和lenB使用超过32个时,断点(在设备代码中的int x=threadIdx.x;中)无法工作并且输出不正确 在主机代码中: int lenA=52; int lenB=52; dim3 threadsPerBlock(lenA, lenB); dim3 numBlocks(lenA / threadsPerBlock.x, lenB / threadsPerBlock.y); kernel_matrix<<<numBlo

我使用
x
y
计算设备中矩阵的单元。 当我对lenA和lenB使用超过32个时,断点(在设备代码中的
int x=threadIdx.x;
中)无法工作并且输出不正确

在主机代码中:

int lenA=52;
int lenB=52;

dim3 threadsPerBlock(lenA, lenB);
dim3 numBlocks(lenA / threadsPerBlock.x, lenB / threadsPerBlock.y);

kernel_matrix<<<numBlocks,threadsPerBlock>>>(dev_A, dev_B);

threadsPerBlock
dim3变量必须是目标变量

CC 1.x设备每个块最多可以处理512个线程

CC 2.0-3.5设备每个块最多可以处理1024个线程

位于(32,32)的dim3变量指定每个块有1024(=32x32)个线程。当您超过该值时,您将获得内核启动失败

如果您在内核启动时这样做,您将看到错误


由于内核实际上不会以这种类型的错误启动,因此内核代码中设置的任何断点也不会被命中。

您忘了问一个问题……为什么lenA或lenB断点的值大于32时无法工作,程序的答案是错误的,但小于32时一切正常?我需要一种不同的方法来初始化x&y吗?这应该写在你的问题中,而不是作为注释删除。请记住,这个问题和答案对于下一个人来说是存在的,与您的帮助一样。谢谢,我只能使用前32个线程,如何使用x&y访问32个以上的线程?您可以在其他线程块中处理这些元素。每个threadblock处理1024个数据元素,这些数据元素可以是32x32块、64x16块或任何您喜欢的数字,因此总数不超过1024个。如果您只是想访问某些数据数组中的其他元素,那么可以使用普通的索引。
int x=  threadIdx.x;
int y=  threadIdx.y;
...