c-通过GEMV将相同的输出作为输入向量来实现破坏性矩阵应用是否安全



如果Anxn矩阵,并且x是维度n-的向量,那么是否可以将x传递给GEMV,作为xy参数的自变量,使用beta=0,以实现操作← A·x

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

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

NO。

输出的每个元素取决于输入向量xALL元素

例如:如果x是输入,y是输出,A是矩阵,CCD_ 10的第CCD_。

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

因此,如果用上面的结果重写x_i,那么依赖于x_i的其他一些x_r将无法接收到正确的输入并产生不正确的结果。

编辑

我本来打算对此发表评论,但它太大了。因此,这里解释了为什么上面的推理也适用于并行实现

除非每个并行组/线程都对原始数据进行本地复制,在这种情况下,原始数据可能会被销毁,否则这条推理路线是可行的。

然而,只有当

  1. 每个并行线程/块将无法访问原始阵列没有大量的过头
  2. 有足够的本地内存(称之为缓存或共享内存,甚至MPI情况下的常规内存),以为每个平行螺纹/块

注:

  • (1) 对于一台机器上的许多多线程应用程序来说可能不是这样
  • (1) 对于CUDA可能是正确的,但是(2)绝对不适用于CUDA

最新更新