cuSPARSE 和 cuBLAS 库如何处理使用 cudaMallocPitch 分配的内存?

nnm*_*ner 4 memory cuda sparse-matrix

我正在实现一个简单的例程,使用 cuSPARSE 的 cusparseScsrmm 执行稀疏矩阵-密集矩阵乘法。这是一个更大的应用程序的一部分,可以使用 cudaMalloc(超过 99% 的时间)或 cudaMallocPitch(很少使用)在 GPU 上分配内存。我有几个关于 cuSPARSE 如何处理倾斜记忆的问题:

1)我将音调内存传递到 cuSPARSE 例程中,但结果不正确(如预期,因为无法将音调作为参数传递)。有没有办法让这些库使用使用 cudaMallocPitch 分配的内存?

2)处理这个问题的最佳方法是什么?我是否应该在调用函数中添加一个检查,以强制不使用倾斜模式分配内存?

Rob*_*lla 5

对于稀疏矩阵运算,倾斜数据的概念无论如何都没有相关性。

对于密集矩阵运算,大多数运算本身并不直接支持数据的“间距”,但是各种运算可以对子矩阵进行运算。需要特别注意的是,此类操作应该可以处理有音调或无音调的数据。每当您看到接受“主维”参数的 CUBLAS(或 CUSPARSE)操作时,这些参数都可以用于包含数据中的音高。

由于“前导维度”参数是在矩阵元素中指定的,并且节距(通常)以字节为单位指定,因此这里需要注意的是,节距可以被所讨论的矩阵元素的大小整除,因此节距(在字节)可以转换为矩阵元素中指定的“前导维度”参数。我预计这对于charintfloatdouble类似类型来说通常是可能的,因为我相信返回的音高数量cudaMallocPitch通常可以被 16 整除。但没有明确的保证,因此建议进行适当的运行时检查,如果您打算使用这种方法。

例如,应该可以对倾斜数据执行 CUBLAS 矩阵-矩阵乘法 ( gemm ),并适当指定ldaldbldc参数。

您指示的操作确实为所涉及的密集矩阵提供了此类主要维度参数。

如果 99% 的用例不使用倾斜数据,我要么根本不支持倾斜数据,要么,对于没有可用的前导尺寸参数的操作,将倾斜数据复制到未倾斜的缓冲区以在所需的操作。设备到设备的无间距复制可以以大约内存带宽的速率运行,因此它可能足够快,对于 1% 的用例来说不会成为严重问题。