0

例如,当累加不同矩阵向量乘法的结果时(即使只有一个累加元素,这也是您在 BLAS 中所做的事情),一个形式上从零向量开始。但是没有无开销的方法可以直接在 CUDA 设备内存上分配一个零数组(或者是否存在?),因此想到的解决方案是简单地采用任意数字的数组,而不是将其初始化为 0 , 将值传递给orbeta = 0.的第一次调用。毕竟,如果它有那个参数“为什么不使用它”。cublas<t>gemvcusparse<t>csrmv

这是

  • 一个好主意?或者情况β = 1 是否以这样的方式进行了优化,以提供整体更好的性能来将数组初始化为 0 然后使用调用cusparseDcsrmv(..., 1., zeroes_array)
  • 安全的?天真地,浮点作为 ℝ 元素的表示应该满足x ⋅ 0 = 0 ∀ x,但是这种天真的处理在处理浮点时当然通常是相当致命的。我很确定当数组先前用于具有相同数据类型的其他一些操作时,结果表现良好,但它对于新分配的设备内存的单元化块安全吗?

我主要对稀疏情况感兴趣,因为对于稠密矩阵,乘法的O ( n ² ) 复杂性使得不必过多考虑向量的O ( n ) 分配的性能。

4

1 回答 1

1

这应该是完全安全的,并且一直在进行;任何在 β=0 时行为不正确的包都会有严重的错误。

csrmv 的 cusparse 文档特别指出“如果 beta 为零,则 y 不必是有效输入”,LAPACK 对 *gemv 说了类似的话(“当 BETA 提供为零时,不需要在输入上设置 Y ")

至于优化,可能 beta=1 和 beta=0 对任何实现都有特定的优化代码路径,但可能没有;可能如果没有,也没有。

于 2012-03-13T13:20:36.207 回答