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 |