next up previous
Next: fork Up: Primitive zum parallelen Programmieren Previous: Primitive zum parallelen Programmieren

m_fork

Mittels m_fork ist es möglich eine bestimmte Anzahl paralleler Prozesse zu starten.

m_fork und die üebrigen m_* Routionen sind spezifische SGI IRIX Funktionen und sollten daher nur in Programmen verwendet werden, die nicht auch auf anderen Betriebsystemen laufen sollen.

m_fork(void (*func)(), ...)

m_set_procs(int numprocs)

Die m_fork-Routine startet numprocs Prozesse, die parallel eine angegebene Funktion func ausführen. Wenn vor dem Aufruf von m_fork numprocs nicht gesetzt wurde, wird der Defaultwert angenommen, der der Anzahl der Prozessoren im System entspricht. Das ist also die Anzahl der Prozesse, die wirklich parallel ausgeführt werden können.

Diese Prozesse haben alle Attribute (wie z.B. User Id, File Deskriptoren) gemeinsam.

Die einzelnen Prozesse können sich durch ihre ID identifizieren. Diese ID kann mit m_get_myid() abgefragt werden.

m_fork eignet sich besonders dafür, nur bestimmte Funktionen eines sequentiellen Programmes zu parallelisieren. Der Rest des Programmes kann in seiner ursprünglichen Form belassen werden.

Beispiel:

#include <stdio.h>

#include <ulocks.h>
#include <task.h>

#define SIZE	4

void mult_func(void);

int matrix1[SIZE][SIZE], matrix2[SIZE][SIZE], matrix3[SIZE][SIZE];

int main(int argc, char **argv) {

  int i, j;

  fprintf(stderr, "Paralleles Multiplizieren 2er 4x4 Matrizen\n");

  fprintf(stderr, " 2 Matrizen werden erzeugt...\n");
  for (i=0; i<SIZE; i++) 
    for (j=0; j<SIZE; j++) {
      matrix1[i][j] = rand()%100;
matrix2[i][j] = rand()%100;
}

  fprintf(stderr, "Anzahl der parallelen Prozess wird auf %d gesetzt.\n", SIZE);
m_set_procs(SIZE);

  fprintf(stderr, "Das parallele Multiplizieren wird gestartet...\n");
  m_fork(mult_func); 

  fprintf(stderr, "main exiting...\n");

  return 0;

}

/*
 * mult_func()
 *
 * mult_func berechnet eine Spalte in der Ergebnismatrix
 * welche Spalte ist abhaengig von der Prozess ID
 *
 */
void mult_func() {

  int i, j, id;
  int matrix_col[4];

  id = m_get_myid();

  for (i=0; i<SIZE; i++) {
    matrix_col[i] = 0;
    for (j=0; j<SIZE; j++)
      matrix_col[i] += matrix1[id][j]*matrix2[j][id];
  }

}

Alle m_*-Befehle auf einen Blick:

int m_fork(void (*func)(), ...); Aufruf der parallelen Funktion
int m_kill_procs(void); Beendet die Slave-Prozesse
int m_set_procs(int numprocs); Setzt die Anzahl der Subtasks (default ist die Anzahl der Prozessoren im System)
int m_get_numprocs(void); Liefert die Anzahl der Subtasks
int m_get_myid(void); Liefert die ID des Subtasks
unsigned m_next(void); Erhöht den globalen Counter (für Synchronisation)
void m_lock(void); Sperrt den globalen Lock
void m_unlock(void); Gibt den globalen Lock frei
int m_park_procs(void); Suspendiert die Kindprozesse
int m_rele_procs(void); Gibt die Kindprozesse wieder frei
void m_sync(void); Synchronisiert alle Prozesse


next up previous
Next: fork Up: Primitive zum parallelen Programmieren Previous: Primitive zum parallelen Programmieren
Mail to: Oliver Schönbrunner