我正在阅读一篇文章,说明方形矩阵的最大尺寸是乘以两个(相同尺寸)平方矩阵(在CUDA中使用一个网格块,最多512个线程)的乘积,为16x16,因为32x32超过512(假设我们希望单个线程计算产品矩阵的每个元素)。我想知道为什么没有提到诸如17x17或22x22等尺寸的矩阵,因为这些尺寸的产品矩阵也不超过512个元素。这是一个内存对齐问题吗?
答案 0 :(得分:1)
您在此处描述的文本中有许多(未说明的)假设。
每块512个线程是cc 1.x设备的限制。较新的设备限制为每块1024个线程。
另一个假设是每个线程只负责一个数据元素,即。输出矩阵中的一点。因此,每个线程块限制为512个输出点(或1024个输出点)。许多朴素矩阵乘法码以这种方式工作,但它不一定是这种方式。没有任何东西可以阻止你编写一个按顺序处理多个(16x16)子矩阵的代码,例如,在一个线程块中。
最后,本文假设您要遵守一般CUDA建议,即线程块由多个线程组成,这些线程等于 32的整数倍,即warp大小。来自here:
每个块的线程数应该选择为warp大小的倍数,以避免尽可能地浪费计算资源。
17x17和22x22不会创建32的整数倍的产品。