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

时间:2016-04-01 17:24:05

标签: memory cuda sparse-matrix

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

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

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

1 个答案:

答案 0 :(得分:4)

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

对于密集矩阵操作,大多数操作不直接支持"音调"但是,对于数据本身,各种操作可以对子矩阵进行操作。有一个特别的警告,这样的操作应该可以处理倾斜或未调整的数据。任何时候你看到CUBLAS(或CUSPARSE)操作接受"领导维度"参数,这些参数可用于包含数据中的间距。

由于"领先维度"参数在矩阵元素中指定,并且音高(通常)以字节为单位指定,这里需要注意的是音高可以被所讨论的矩阵元素的大小整除,以便音高(以字节为单位)可以转换为"领先维度"矩阵元素中指定的参数。我希望charintfloatdouble和类似类型通常可以实现,因为我相信cudaMallocPitch返回的音高数量通常可以被16整除。但是没有明确的保证,所以如果你打算使用这种方法,建议进行适当的运行时检查。

例如,应该可以对投放数据执行CUBLAS矩阵 - 矩阵乘法(gemm),并适当指定ldaldb和{{1}参数。

operation you indicate确实为所涉及的密集矩阵提供了这样的主要维度参数。

如果99%的用例不使用音调数据,我要么根本不支持音调数据,要么对于没有领先维度参数的操作,将音调数据复制到未调整的数据缓冲区用于所需的操作。设备到设备投放到无需复制的副本可以大约以内存带宽的速度运行,因此它可能足够快,不会成为1%用例的严重问题。