嗨,我有一个用C++编写的程序,其中有一个或两个函数正在使用PETSc。

当我调用这些函数时,这是使用PETSc时的正确方法

1) a)change all MPI_COMM_WORLD to PETSC_COMM_WORLD for my entire program
   b)change MPI_Init to PetscInitialize

..

2)为petsc创建一个单独的通讯世界,并将其传递给函数
    MPI_Init(&argc, &argv);
    ..
    //some many line of code
    ..

    MPI_Comm_split(MPI_COMM_WORLD, rank, 0, &PETSC_COMM_WORLD);

    petsc_function(PETSC_COMM_WORLD,.....

    //some how reverting the comm_split here to continue as normal so all the non petsc functions work

..

3)或者我可以只通过使用带Petsc函数的MPI_COMM_WORLD来获得
..

4)还是我不知道另一种方法?

最佳答案

您需要先调用PetscInitialize。您可以用它替换对MPI_Init的调用。

除非您只想对等级的子集使用PETSc,否则无需设置PETSC_COMM_WORLD。如果您自己未设置PETSC_COMM_WORLD,那么PetscInitialize会自动将其设置为MPI_COMM_WORLD的副本。

然后,当您调用PETSc函数时,可以使用PETSC_COMM_WORLD。在程序结束时,调用PetscFinalize,它将为您调用MPI_Finalize,除非您手动调用MPI_Init而不是单独使用PetscInitialize

在程序的其余部分中,无需将MPI_COMM_WORLD更改为PETSC_COMM_WORLD

关于c++ - PETSc和MPI COMM世界的正确用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11278130/

10-10 21:29