【发布时间】:2021-03-20 05:00:31
【问题描述】:
我正在使用 cublas 库处理一些大数据以进行矩阵乘法。为了节省内存空间,我想要A=A*B 之类的东西,其中A 和B 都是n×n 方阵,即对输出和输入矩阵之一使用相同的内存空间。
虽然一些旧帖子说这在 cublas 库中是不允许的,但我实际上使用 cublasZgemmStridedBatched() 函数实现了它。令人惊讶的是,计算是完全正确的,并且反复运行是稳定的。所以我想知道当前的cublas库是否支持重叠的输入和输出。如果是,它实际节省了多少内存?我的意思是直观地说该函数至少需要一些额外的内存来存储中间计算,因为Aij = AikBkj 依赖于整行 A。这对于批处理 gemms 是否特别节省内存?
【问题讨论】:
-
我认为在一般情况下不提供 CUBLAS 中的输入/输出重叠,除了
geam等少数例外情况。我怀疑在各种矩阵乘法运算(包括gemmStridedBatched)的情况下,您可能能够编写一个演示案例,在其中您可以观察到失败,可能涉及到单独足够大的矩阵。 -
@Robert Crovella 感谢 cmets。我使用 'cublasDgemm()' 进行了更多测试。在我的 GPU 上,就地操作在恰好 512×512 矩阵之前是正确的,而对于 513×513 矩阵则错误。
-
这似乎工作和似乎不工作的情况可能取决于 GPU 类型、CUDA 版本和特定的 CUBLAS 函数,也许还有其他变量。您的测试用例足以证明它不是一般提供的,因此即使有特定限制,我也会非常犹豫是否依赖它。