Résolution d'un système Ax = b simple en parallèle avec PETSc

10

Je suis nouveau dans le package PETSc.

J'ai une matrice A ~ 4000x4000 au format matriciel et je veux que PETSc résolve cela en utilisant plusieurs processeurs.

Je sais comment résoudre le système sur un seul processeur, mais je ne sais pas comment répartir la matrice et les vecteurs entre différents processeurs.

Existe-t-il un simple ensemble d'instructions pour ce faire?

Bouddha souriant
la source

Réponses:

14

Matrix Market est un format terrible pour la lecture en parallèle, il est donc préférable de prétraiter vers un meilleur format parallèle. La taille de votre matrice est extrêmement petite, donc les performances ne sont pas un problème, mais le plus simple et le plus général consiste à utiliser Python ou Matlab / Octave pour écrire le fichier Matrix Market au format binaire PETSc, qui peut être lu efficacement en parallèle en utilisant MatLoad(). Par exemple, vous pouvez utiliser ce code Python pour le prétraitement (ajouter $PETSC_DIR/bin/pythonscriptsà votre PYTHONPATH)

import scipy.io, PetscBinaryIO
A = scipy.io.mmread('thematrix.mtx')
PetscBinaryIO.PetscBinaryIO().writeMatSciPy(open('petscmatrix','w'), A)

Vous pouvez également écrire un vecteur dans le fichier à ce stade. Si vous voulez simplement lire et résoudre le système, vous pouvez utiliser src/ksp/ksp/examples/tutorials/ex10.c(avec l'option -f petscmatrixde lire le fichier binaire que vous venez d'écrire).

Dans une application réelle, vous devez éviter un flux de travail qui implique l'écriture de fichiers sur disque dans n'importe quel format. Il est préférable d’assembler la matrice en parallèle en utilisant une représentation du problème décomposée par domaine. La plupart des exemples dans PETSc sont écrits de cette façon.

Jed Brown
la source