使用CUBLAS / CUSPARSE操作将unitialised数组的元素设置为0是否安全?

时间:2012-03-13 13:05:46

标签: c cuda blas initialization cublas

例如累积不同矩阵向量乘法的结果(即使只有一个累积元素,这就是你在BLAS中所做的),一个正式以零向量开始。但是没有直接在CUDA设备内存上分配零数组的无开销方法(或者在那里?),所以跳到脑海的解决方案是简单地采用具有任意数字的数组,而不是将其初始化为0 ,将值beta = 0.传递给cublas<t>gemvcusparse<t>csrmv的第一个电话。毕竟,如果它有参数“为什么不使用它”。

这是

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

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

1 个答案:

答案 0 :(得分:1)

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

csrmv的cusparse文档特别说“如果beta为零,则y不必是有效输入”,LAPACK表示* gemv类似的东西(“当BETA提供为零时,Y不需要设置输入“)

对于优化,可能是beta = 1和beta = 0的情况可能适用于任何实现的特定优化代码路径,但可能不会;可能如果没有,也不会。