将GEMV作为输入向量传递给相同的输出以实现破坏性矩阵应用是否安全?

lef*_*out 4 c fortran cuda blas

如果An × n矩阵而x是维数n的向量,那么可以将xGEMV作为参数传递给xy参数beta=0,以实现操作xA · x

我对使用C接口的Cublas实现特别感兴趣.

Ian*_*ush 6

没有.对于Fortran,它与实现无关 - 在Fortran中,它打破了语言标准,为任何子程序设置别名的实际参数,因为它打破了语言标准,除非那些参数是Intent(In).因此,如果接口具有Intent(Out),Intent(InOut)或没有Intent的伪参数,则在调用子程序时应始终对相应的实际参数使用单独的变量.


Pav*_*ili 2

不。

输出的每个元素取决于输入向量的所有元素x

例如:如果x是输入y, 是输出A, 是矩阵,i的第 个元素y将按以下方式生成。

y_i = A_i1*x_1 + A_i2 * x_2 ... + A_in * x_n

x_i因此,如果您用上面的结果覆盖,则其他x_r依赖项x_i将无法收到正确的输入并产生不正确的结果。

编辑

我本来想对此发表评论,但它变得太大了。这就是为什么上述推理也适用于并行实现的解释。

除非每个并行组/线程都制作原始数据的本地副本(在这种情况下可以破坏原始数据),否则这一推理成立。

然而,这样做(制作本地副本)仅在以下情况下才实用且有益:

  1. 如果没有大量的开销,每个并行线程/块将无法访问原始数组。
  2. 有足够的本地内存(称为高速缓存,或共享内存,甚至在 MPI 的情况下称为常规内存)来为每个并行线程/块保存单独的副本。

笔记:

  • (1) 对于单台机器上的许多多线程应用程序可能不成立。
  • (1) 对于 CUDA 可能是正确的,但 (2) 绝对不适用于 CUDA。