Rozwiązywanie prostego systemu Ax = b równolegle z PETSc

10

Jestem nowy w pakiecie PETSc.

Mam macierz A ~ 4000x4000 w formacie matrycowym i chcę, aby PETSc rozwiązał ten problem za pomocą wielu procesorów.

Wiem, jak rozwiązać system na jednym procesorze, ale nie wiem, jak rozdzielić macierz i wektory między różne procesory.

Czy istnieje prosty zestaw instrukcji, aby to zrobić?

smilingbuddha
źródło

Odpowiedzi:

14

Matrix Market to straszny format do równoległego czytania, dlatego lepiej jest wstępnie przetworzyć na lepszy format równoległy. Rozmiar macierzy jest bardzo mały, więc wydajność nie stanowi problemu, ale najłatwiejszą i najbardziej ogólną rzeczą jest użycie Pythona lub Matlaba / Octave'a do zapisania pliku Matrix Market w formacie binarnym PETSc, który można efektywnie odczytywać równolegle MatLoad(). Na przykład możesz użyć tego kodu Python do przetwarzania wstępnego (dodaj $PETSC_DIR/bin/pythonscriptsdo swojego PYTHONPATH)

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

W tym momencie możesz również napisać wektor do pliku. Jeśli chcesz tylko przeczytać i rozwiązać system, możesz użyć src/ksp/ksp/examples/tutorials/ex10.c(z opcją -f petscmatrixodczytu właśnie zapisanego pliku binarnego).

W prawdziwej aplikacji należy unikać przepływu pracy polegającego na zapisywaniu plików na dysk w dowolnym formacie. O wiele lepiej jest złożyć matrycę równolegle, używając dekompozycji reprezentacji problemu. Większość przykładów w PETSc jest napisanych w ten sposób.

Jed Brown
źródło