110 likes | 237 Views
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Allgemeine Datentypen. Oswald Haan ohaan@gwdg.de. Motivation. Bisher: Austausch von Nachrichten, bestehend aus n aufeinanderfolgenden Elementen des gleichen vordefinierten Basis-Datentyps: MPI_SEND( sbuf , n, MPI_INTEGER, …)
E N D
GWDG – KursParallelrechner-Programmierung mit MPIMPIAllgemeine Datentypen Oswald Haan ohaan@gwdg.de
Motivation Bisher: Austausch von Nachrichten, bestehend aus • n aufeinanderfolgenden Elementen • des gleichen vordefinierten Basis-Datentyps: • MPI_SEND(sbuf, n, MPI_INTEGER, …) Allgemeiner: Austausch von Nachrichten, bestehend aus • beliebig liegende Elemente • mit unterschiedlichen Datentypen • MPI_xxx(sbuf, n, MPI_yyy, … Parallelrechner-Programmierung mit MPI
Abgeleiteter Datentyp Datenobjekt aus m Daten, definiert durch • Sequenz von Datentypen : typ0, typ1, … • Sequenz von Adressabständen in Byte der Daten von der Basisadresse buf : disp0, disp1, … • Adresse des i-ten Datums: buf+ dispi • Typ des i-ten Datums: typi Die Abstände können positiv, null oder negativ sein, Überlappung und Wiederholung sind möglich Die Konstruktion kann rekursiv eingesetzt werden Parallelrechner-Programmierung mit MPI
Abgeleiteter Datentyp MPI_TYPE_CREATE_STRUCT(count, array_of_blocklengths, array_of_displacements, array_of_types, newtype) IN count number of blocks (non-negative integer) IN array_of_blocklength number of elements in each block (array of non-negative integer) IN array_of_displacements byte displacement of each block (array of integer) IN array_of_types type of elements in each block (array of handles to datatypeobjects) OUT newtype new datatype (handle) Newtype : Parallelrechner-Programmierung mit MPI
Abgeleiteter Datentyp Beispiel MPI_R8_I4 Datentyp bestehend aus REAL*8 und INTEGER*4 Größe: 16 Byte, wegen Alignement I4 R8 bl(0) = 1; bl(1) = 1; dp(0) = 0; dp(1) = 8; ty(0) = MPI_DOUBLE_PRECISION, ty(1) = MPI_INTEGER call MPI_TYPE_CREATE_STRUCT( 2, bl, dp, ty, MPI_R8_I4, ierr) Erzeugt abgeleiteten Datentyp MPI_R8_I4 Parallelrechner-Programmierung mit MPI
Datentyp CONTIGUOUS MPI_TYPE_CONTIGUOUS(count, oldtype, newtype) IN count replication count (non-negative integer) IN oldtype old datatype (handle) OUT newtype new datatype (handle) Newtype : Parallelrechner-Programmierung mit MPI
Datentyp CONTIGUOUS Beispiel MPI_CONTIGUOUS4, Datentyp bestehend aus aufeinanderfolgenden 4 REAL*8 Zahlen Größe: 32 Byte R8 R8 R8 R8 call MPI_TYPE_CONTIGUOUS( 4, MPI_DOUBLE_PRECISION, MPI_CONTIGUOUS4, ierr) Erzeugt abgeleiteten Datentyp MPI_CONTIGUOUS4 Parallelrechner-Programmierung mit MPI
Verwendung Abgeleiteter Datentypen AbgeleiteteDatantypenkönnen in allenKommunikationsroutinenanstelle der vordefinierten Basis-Typenverwendetwerden. Siemüssenvorherdurch MPI_TYPE_COMMIT angemeldet und hinterherdurch MPI_MPI_TYPE_FREE wiederabgemeldetwerden MPI_TYPE_xxx(…, MPI_NEWTYPE,… ) MPI_TYPE_COMMIT( MPI_NEWTYPE ) … Aufrufe von Kommunikationsroutinen mit Datentyp MPI_NEWTYPE … MPI_TYPE_FREE(MPI_NEWTYPE ) Parallelrechner-Programmierung mit MPI
Verwendung von MPI_CONTIGUOUS4 Ersetze in allen Tasks die Elemente v(100),..,v(103) durch die auf tasks id 0 gespeichertenWerte Double precisionvec(100) Call MPI_TYPE_CONTIGUOUS( 4, MPI_DOUBLE_PRECISION, MPI_CONTIGUOUS4, ierr ) call MPI_TYPE_COMMIT( MPI_DPVECTOR4, ierr) call MPI_BCST( vec(100), 1, MPI_CONTIGUOUS4, 0, MPI_COMM_WORLD, ierr ) MPI_TYPE_FREE(MPI_CONTIGUOUS4 ) Parallelrechner-Programmierung mit MPI
Verwendung von TYPE_VECTOR Versendeauseiner Matrix mat der Größe 100 x 100 die beim Element (20,30) liegendeSubmatrix der Größe 4 x 10 double precisionmat(100,100) integer MPI_SUBMAT4x10 Call MPI_TYPE_VECTOR( 10, 4, 100,MPI_DOUBLE_PRECISION, MPI_SUBMAT4x10, ierr ) call MPI_TYPE_COMMIT( MPI_SUBMAT4x10, ierr) call MPI_BCST( mat(20,30), 1, MPI_SUBMAT4x10, 0, MPI_COMM_WORLD, ierr ) MPI_TYPE_FREE(MPI_SUBMAT4x10 ) (20,30) Parallelrechner-Programmierung mit MPI
Datentyp VECTOR MPI_TYPE_VECTOR( count, blocklength, stride, oldtype, newtype) IN countnumberofblocks (non-negative integer) IN blocklengthnumberofelements in each block (non-negative integer) IN stridenumberofelementsbetweenstartofeach block (integer) IN oldtypeolddatatype (handle) OUT newtypenewdatatype (handle) Newtype : Parallelrechner-Programmierung mit MPI