2016-11-11 2 views
0

Je souhaiterais utiliser la bibliothèque PETSc pour résoudre de grands systèmes de processus distribués d'équations linéaires dans mon propre programme. Aussi, je voudrais engager des ressources GPU disponibles pour ce but. J'utilise un maillage structuré pour la représentation discrète du domaine de calcul 3D, donc il est préférable d'utiliser des tableaux distribués PETSc pour éviter les transferts de données supplémentaires entre les processus.Résolution d'un grand système d'équations linéaires à l'aide de matrices distribuées MPI + CUDA et PETSc

J'ai configuré PETSc avec la chaîne suivante: ./configure --prefix=/usr/local/petsc --with-mpi=1 --with-cuda=1 --with-cusp=1 --with-cusp-include=/usr/local/cuda/include/cusp/ --with-cusp-lib=

puis installé à /usr/local/petsc emplacement.

Maintenant, je suis en train de créer un objet ADTM dans le programme de test simple:

#include <stdio.h> 
#include <math.h> 
#include <string.h> 
#include <stdlib.h> 

#include "cuda.h" 
#include "mpi.h" 

/* PETSc headers */ 
#include "petscsys.h" 
#include "petscksp.h" 
#include "petscdmda.h" 
#include "petscksp.h" 

int main(int argc, char *argv[]) 
{ 
    MPI_Init(&argc, &argv); 

    PetscInitialize(&argc, &argv, NULL, NULL); 

    DM da; 
    Vec x, b;    /* right hand side, exact solution */ 
    Mat A;     /* linear system matrix */ 
    KSP ksp;     /* linear solver context */ 
    KSPType ksptype; 
    PC pc; 
    PCType pctype; 
    PetscErrorCode ierr; 

    PetscInt Nx = 100; 
    PetscInt Ny = 100; 
    PetscInt Nz = 100; 

    PetscInt NPx = 1; 
    PetscInt NPy = 1; 
    PetscInt NPz = 1; 

    ierr = DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_STAR, 
         Nx, Ny, Nz, NPx, NPy, NPz, 1, 1, NULL, NULL, NULL, &da); CHKERRQ(ierr); 

    ierr = DMSetMatType(da, MATMPIAIJ); CHKERRQ(ierr); 

    /* Create distributed matrix object according to DA */ 
    ierr = DMCreateMatrix(da, &A); CHKERRQ(ierr); 

    /* Initialize all matrix entries to zero */ 
    /* 
    ierr = MatZeroEntries(A); CHKERRQ(ierr); 
    */ 

    fprintf(stdout, "All was done.\n"); 

    PetscFinalize(); 
    MPI_Finalize(); 

    return 0; 
} 

Mais quand je suis en ce que je reçois une erreur:

[0]PETSC ERROR: --------------------- Error Message -------------------------------------------------------------- 
[0]PETSC ERROR: No support for this operation for this object type 
[0]PETSC ERROR: DM can not create LocalToGlobalMapping 
[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting. 
[0]PETSC ERROR: Petsc Development GIT revision: v3.7.4-1919-g73530f8 GIT Date: 2016-11-09 03:25:31 +0000 
[0]PETSC ERROR: Configure options --prefix=/usr/local/petsc --with-mpi=1 --with-cuda=1 --with-cusp=1 --with-cusp-include=/usr/local/cuda/include/cusp/ --with-cusp-lib= 
[0]PETSC ERROR: #1 DMGetLocalToGlobalMapping() line 986 in ~/petsc/src/dm/interface/dm.c 
[0]PETSC ERROR: #2 DMCreateMatrix_DA_3d_MPIAIJ() line 1051 in ~/petsc/src/dm/impls/da/fdda.c 
[0]PETSC ERROR: #3 DMCreateMatrix_DA() line 760 in ~/petsc/src/dm/impls/da/fdda.c 
[0]PETSC ERROR: #4 DMCreateMatrix() line 1201 in ~/petsc/src/dm/interface/dm.c 
[0]PETSC ERROR: #5 main() line 47 in petsc_test.c 
[0]PETSC ERROR: No PETSc Option Table entries 
[0]PETSC ERROR: ----------------End of Error Message -------send entire error message to [email protected] 

Quoi de mal à ce code simple? Le résultat de la commande uname -a: Linux PC 4.4.0-47-generiC#68-Ubuntu SMP Wed Oct 26 19:39:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux.

L'implémentation Open MPI des spécifications MPI est utilisée.

Répondre

0

Depuis quelque temps, il faut appeler explicitement la routine DMSetUp() après DMDACreate3d(). Voir here pour plus de détails.