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

Memory cuSPARSE和cuBLAS库如何处理使用CudamAllocPictch分配的内存?,memory,cuda,sparse-matrix,Memory,Cuda,Sparse Matrix,我正在实现一个简单的例程,它使用cuSPARSE中的cusparseScsrmm执行稀疏矩阵-密集矩阵乘法。这是一个更大的应用程序的一部分,它可以使用cudaMalloc(超过99%的时间)或cudamalocpatch(很少使用)在GPU上分配内存。关于cuSPARSE如何处理倾斜记忆,我有几个问题: 1) 我将音调内存传递到cuSPARSE例程中,但结果不正确(正如预期的那样,因为无法将音调作为参数传递)。有没有办法让这些库使用cudamallocpatch分配的内存工作 2) 处理这个问题

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

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


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

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

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

由于“前导维度”参数是在矩阵元素中指定的,而节距(通常)是以字节为单位指定的,因此这里的警告是节距可以被所讨论的矩阵元素的大小均匀整除,因此节距(以字节为单位)可以转换为矩阵元素中指定的“前导维度”参数。我希望这通常适用于
char
int
float
double
和类似类型,因为我相信
cudamallocitch
返回的音高量通常可以被16整除。但是没有明确的保证,所以如果您打算使用这种方法,建议进行适当的运行时检查

例如,应该可以使用
lda
ldb
ldc
参数的适当规格,对倾斜数据执行CUBLAS矩阵乘法()

对于所涉及的稠密矩阵,确实提供了这样的前导维参数

如果99%的用例不使用倾斜数据,我要么根本不支持倾斜数据,要么,对于没有前导维度参数的操作,将倾斜数据复制到未对齐的缓冲区,以便在所需的操作中使用。放置到未粘贴拷贝的设备到设备可以以大约内存带宽的速率运行,因此它可能足够快,对于1%的用例来说,这不是一个严重的问题