4

如果A是一个n x n矩阵并且x是一个维度为n的向量,那么是否可以将xGEMV作为参数传递给xy参数,用beta=0来实现操作xAx

我对带有 C 接口的 Cublas 实现特别感兴趣。

4

2 回答 2

6

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

于 2012-03-29T12:52:02.307 回答
1

不。

输出的每个元素取决于输入向量的所有元素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。
于 2012-03-29T19:46:59.113 回答