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

时间:2012-03-29 12:04:06

标签: c cuda fortran blas

如果 A n x n 矩阵且 x 维度 n < / em>,是否可以将 x 传递给GEMV作为xy参数的参数,beta=0,实现操作 x A x

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

NO。

输出的每个元素都取决于输入向量的{em> ALL 元素x

例如:如果x是输入而y是输出,则A是矩阵, i的{​​{1}}元素将按以下方式生成。

y

因此,如果您使用上面的结果覆盖y_i = A_i1*x_1 + A_i2 * x_2 ... + A_in * x_n,则依赖于x_i的其他x_r将无法获得正确的输入并产生不正确的结果。

修改

我打算把它作为评论,但它太大了。所以这里解释为什么上述推理也适用于并行实现。

除非每个并行组/线程都创建原始数据的本地副本,否则原始数据可以被销毁,这一推理线仍然存在。

然而,这样做(制作本地副本)只有在

时才实用且有益
  1. 每个并行线程/块都无法访问 原始阵列没有大量的开销。
  2. 有足够的本地内存(称之为缓存,或共享内存甚至 MPI的常规内存)为每个内容保存一个单独的副本 并行线程/块。
  3. 注意:

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