PETSc和MPI COMM正确使用世界

时间:2012-06-30 22:24:18

标签: c++ c mpi

您好我有一个用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创建一个单独的comm世界并将其传递给函数

    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)还是有另一种我不知道的方法?

1 个答案:

答案 0 :(得分:3)

您需要先致电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