在GPU上进行大型矩阵乘法

9

我需要使用CUDA在GPU上实现大矩阵的矩阵乘法。每个矩阵的大小都超过了GPU内存。因此,我认为我需要一个有效的算法来解决这个问题。我在网上搜寻却没有找到相关信息。请问是否有人能提供这样算法的名称或链接。


1
那么,将矩阵简单地拆分为 [A0;A1] * [B0 B1] = [A0*B0 A0*B1; A1*B0 A1*B1] 如何?这可能是一个不错的开始。 - kangshiyin
1个回答

22

针对这种整个问题不能同时存储在内存中的线性代数计算,实际上没有一个正式的算法,通常称为"out of core"操作。

要解决这个问题,你不需要特别复杂的算法,只需要使用CUBLAS库和笔纸。例如,你可以将矩阵乘积分解如下:

enter image description here

这样就得到了四个独立的子矩阵乘法操作。可以使用非常直观的主机代码,通过四次调用CUBLAS gemm 来计算它们。你可以根据问题规模和GPU容量,将此思想扩展到尽可能多的子矩阵。同样的原理也可用于在多个GPU上实现矩阵乘法问题(有关示例,请参见此问题)。

另一种选择是,在哈佛开发的SciGPU-GEMM代码库和HPL-CUDA linpack实现中找到此精确思路的工作实现(声明:我与后者代码库有关联)。


1
+1. 分解来自哪里?当然是个好答案! - Rekin
2
@Rekin:我不明白你在问什么。这个数学公式是我自己想出来的,你看到的图片是我用LaTeX渲染成gif格式并上传到SO图像托管服务的。 - talonmies
1
抱歉,我指的是数学公式。我以前上过代数课,其中大矩阵乘法主题被呈现为最难以计算的问题之一。这让我产生了错误的感觉,认为它是不可能解决的。 - Rekin
3
在线性代数中,块矩阵算法是高效数值实现的核心主题。请参见这里,了解块矩阵的概念,并查看lapack中如何组织块矩阵计算的内容。 - Stefano M
谢谢您的回复。我不知道这个矩阵属性,不了解它可能会带来很大的问题! - Eb Abadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接