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