C++ 使用CUDA计算(非常)大的矩阵积
我刚刚开始学习一些C++ 使用CUDA计算(非常)大的矩阵积,c++,matrix,cuda,C++,Matrix,Cuda,我刚刚开始学习一些cuda编程,我对如何处理超过块/线程大小的大型矩阵的计算很感兴趣 例如,我有一个例子显示了如何执行平铺矩阵乘法,但由于块大小和网格大小太小,它失败了。在上述代码中,如果块大小和网格大小均设置为1,则仅计算最终矩阵的第一个元素 答案很简单:用更大的块和网格大小调用内核,但是当我想执行800万行和600万列的矩阵乘法时会发生什么?对于任何现代GPU来说,都没有合适的网格和块大小的任意大的矩阵乘法 我在哪里可以找到如何处理这类事情的示例代码或算法?我认为最简单的情况应该是一个矩阵乘
cuda
编程,我对如何处理超过块/线程大小的大型矩阵的计算很感兴趣
例如,我有一个例子显示了如何执行平铺矩阵乘法,但由于块大小和网格大小太小,它失败了。在上述代码中,如果块大小和网格大小均设置为1
,则仅计算最终矩阵的第一个元素
答案很简单:用更大的块和网格大小调用内核,但是当我想执行800万行和600万列的矩阵乘法时会发生什么?对于任何现代GPU来说,都没有合适的网格和块大小的任意大的矩阵乘法
我在哪里可以找到如何处理这类事情的示例代码或算法?我认为最简单的情况应该是一个矩阵乘法算法,如果使用
调用,它就可以工作,任何能够解释此调用的算法都应该能够解释任何较大的矩阵。非常大的矩阵的主要问题不是块数或线程数。主要的问题是,您无法在GPU的DRAM内存中容纳整个矩阵。因此,为了进行乘法,您需要手动使用平铺将输入矩阵划分为可以放入GPU内存中的平铺。然后,您需要在GPU上以所需的线程数对该磁贴运行矩阵乘法,然后将磁贴结果返回给主机(CPU)
当您在GPU上处理这些大程序块时,需要启动1000个线程才能获得所需的性能。只启动一个线程对您没有任何帮助
有关更多信息,请参阅本文:
基于CUDA的超大矩阵计算的快速实现
我刚通过谷歌搜索“大矩阵乘法CUDA”找到了它。一个600万乘800万个元素的密集浮点矩阵需要大约192 TB的存储空间(两倍是两倍)。如果每个元素分配一个线程,它“只”需要大约48万亿个线程--35位寻址。cc3.0+设备上的CUDA网格DIM(理论上)提供了约63位的块地址空间,更不用说每个块有1024个线程(因此超过70位的可寻址线程空间)。这个问题似乎基于错误的前提:“任意大的东西,任何现代GPU都没有合适的网格和块大小。”