在并行 PETSC 程序中创建局部向量

计算科学 宠物
2021-12-04 05:18:37

在我的一个 PETSc 程序中,我需要一个处理器来访问另一个处理器的值。

因此,在 PETSc 常见问题解答中,此问题已在此处简要解决。为了创建一个本地向量,我试过这个

Vec local;
ierr = VecCreateSeq(PETSC_COMM_WORLD,10,&local);CHKERRQ(ierr);

其中 10 是我希望创建的局部向量的大小。但是使用 2 个处理器运行会给我一个错误

[0]PETSC ERROR: --------------------- Error Message ------------------------------------
[0]PETSC ERROR: Invalid argument!
[0]PETSC ERROR: Cannot create VECSEQ on more than one process!
[0]PETSC ERROR: ------------------------------------------------------------------------

所以更准确地说,我想编写一个玩具代码,我想从一个v分布在 n 个处理器上的大向量中添加所有元素。

我想通过将所有元素收集v到 Process 0 本地的向量中并将它们全部加起来来做到这一点。

更一般地说,Process 0 如何从任何特定的处理器(比如处理器)获取元素i

1个回答

PETSC_COMM_WORLD是一个全球传播者。用于PETSC_COMM_SELF创建顺序对象。

使用VecScatterCreateToZero收集排名 0。(显然这不是内存可扩展的,所以尽量不要在实际应用程序中这样做。)

VecScatter用于任意(通常是稀疏的)集合向量分布。