Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用CUDA计算(非常)大的矩阵积_C++_Matrix_Cuda - Fatal编程技术网

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都没有合适的网格和块大小。”