我正在实现一个简单的例程,它使用cuSPARSE中的cusparseScsrmm执行稀疏矩阵 - 密集矩阵乘法。这是一个更大的应用程序的一部分,可以使用cudaMalloc(超过99%的时间)或cudaMallocPitch(很少使用)在GPU上分配内存。关于cuSPARSE如何处理内存,我有几个问题:
1)我将调整后的内存传入cuSPARSE例程,但结果不正确(正如预期的那样,因为没有办法传递音调作为参数)。有没有办法让这些库使用cudaMallocPitch分配内存?
2)处理这个问题的最佳方法是什么?我应该在调用函数中添加一个检查,以强制使用投放模式分配内存不吗?
答案 0 :(得分:4)
对于稀疏矩阵运算,无论如何,音调数据的概念都没有相关性。
对于密集矩阵操作,大多数操作不直接支持"音调"但是,对于数据本身,各种操作可以对子矩阵进行操作。有一个特别的警告,这样的操作应该可以处理倾斜或未调整的数据。任何时候你看到CUBLAS(或CUSPARSE)操作接受"领导维度"参数,这些参数可用于包含数据中的间距。
由于"领先维度"参数在矩阵元素中指定,并且音高(通常)以字节为单位指定,这里需要注意的是音高可以被所讨论的矩阵元素的大小整除,以便音高(以字节为单位)可以转换为"领先维度"矩阵元素中指定的参数。我希望char
,int
,float
,double
和类似类型通常可以实现,因为我相信cudaMallocPitch
返回的音高数量通常可以被16整除。但是没有明确的保证,所以如果你打算使用这种方法,建议进行适当的运行时检查。
例如,应该可以对投放数据执行CUBLAS矩阵 - 矩阵乘法(gemm),并适当指定lda
,ldb
和{{1}参数。
operation you indicate确实为所涉及的密集矩阵提供了这样的主要维度参数。
如果99%的用例不使用音调数据,我要么根本不支持音调数据,要么对于没有领先维度参数的操作,将音调数据复制到未调整的数据缓冲区用于所需的操作。设备到设备投放到无需复制的副本可以大约以内存带宽的速度运行,因此它可能足够快,不会成为1%用例的严重问题。