Matrixmultiplikatin mit pthreads



  • Hallo als Hausaufgabe sollen wir eine Matrixmultiplikation schreiben, die wahlweise sequentiell ist oder spaltenweise (pro Spalte ein Thread) rechnet.

    Da das mein erster Ausflug ins Reich der pthreads ist, bin ich noch etwas wackelig auf den Beinen, deswegen:

    Könnt ihr den Code mal anschaun?
    Bei der Korrektur bitte ich darum es nicht optimieren zu wollen, also wenn etwas nur umständlich aber korrekt ist, dann ist das schon ok.

    Wichtig ist für mich:
    Funktioniert das Programm?
    Ist die Speicherverwaltung ok? Wobei malloc-Fehler ignoriert werden
    Und vor allem: Werden die Threads richtig behandelt?

    Genug Vorspiel:

    #include<stdlib.h>
    #include<stdio.h>
    #include<limits.h>
    #include<pthread.h>
    #include<string.h>
    
    typedef struct arg_t
    {
        int dim;
        int col;
        double** a;
        double** b;
        double** c;
    } arg_t;
    
    void* shm_mm(void* arg)
    {
        arg_t* work = (arg_t*) arg;
        for(int i=0; i<work->dim;i++)
        {
            double sum = 0;
            for(int k=0;k < work->dim;k++)
            {   
                sum += work->a[i][k] * work->b[k][work->col];
            }
            work->c[i][work->col] = sum; 
        }
    }
    
    void seq_mm(int dim, double** a, double** b, double** c)
    {
        for(int i=0; i<dim; i++)
        {
            for(int j=0;j<dim;j++)
            {
                double sum = 0;
                for(int k=0; k<dim;k++)
                {
                    sum += a[i][k] * b[k][j];
                }
                c[i][j] = sum; 
            }
            printf("\n");
        }
    }
    
    void display(int dim,double** m)
    {
        for(int i=0; i<dim; i++)
        {
            for(int j=0;j<dim;j++)
            {
                printf("%f ",m[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    
    void FREE(int dim, double** a, double** b, double** c)
    {
        for(int i=0; i<dim;i++)
        {
            free(a[i]);
            free(b[i]);
            free(c[i]);
        }
        free(a);
        free(b);
        free(c);
    }
    
    int main(int argc, char* argv[])
    {
        // falsche Anzahl Argumente
        if(argc != 3)
        {
            printf("Falsche Anzahl an Argumenten\n2 erwartet, %d übergeben\n", argc-1);
            return EXIT_FAILURE;
        }
    
        // Dimension setzen
        int dim = atoi(argv[1]);
        if(!dim || dim < 0 || dim == INT_MAX || dim == INT_MIN)
        {
            printf("Argument '%s' konnte nicht als Zahl interpretiert werden\n",argv[1]);
            return EXIT_FAILURE;
        }
    
        // Matrix A 
        double** a = malloc(dim * sizeof(double*));
        for(int i=0; i<dim; i++)
        {
            a[i] = malloc( dim * sizeof(double));
        }
    
        for(int i=0; i<dim; i++)
        {
            for(int j=0;j<dim;j++)
            {
                a[i][j] = (i+2)*(j+1);
            }
        }
    
        // Matrix B 
        double** b = malloc(dim * sizeof(double*));
        for(int i=0; i<dim; i++)
        {
            b[i] = malloc( dim * sizeof(double));
        }
    
        for(int i=0; i<dim; i++)
        {
            for(int j=0;j<dim;j++)
            {
                b[i][j] = (i+2)*(j+1);
            }
        }
    
        // Matrix C 
        double** c = malloc(dim * sizeof(double*));
        for(int i=0; i<dim; i++)
        {
            c[i] = malloc( dim * sizeof(double));
        }
    
        if(strcmp(argv[2], "seq")==0 )
            seq_mm(dim, a,b,c);
    
        else
        {
            pthread_t* threads = malloc(dim * sizeof(pthread_t));
            arg_t* args = malloc(dim* sizeof(arg_t ));
            for(int i=0; i<dim;i++)
            {
                args[i].dim = dim;
                args[i].col = i;
                args[i].a = a;
                args[i].b = b;
                args[i].c = c;
    
                int rc = pthread_create(&threads[i], NULL, shm_mm, &args[i]); 
            }
            for(int i=0;i<dim;i++)
            {
                pthread_join(threads[i],NULL);
            }
    
            free(threads);
            free(args);
        }
    
        display(dim, a);
        display(dim, b);
        display(dim, c);
    
        FREE(dim, a,b,c);
    }
    


  • www.cooles-hausaufgabenboard.de ...

    Gibts irgendwelche Fehlermeldungen beim Kompilieren oder Ausführen? Hast Du konkrete Fragestellungen zu einzelnen Funktionen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Konkrete Fragen sind eigentlich nicht vorhanden,
    keine fehlermeldungen beim Kompilieren und für 3x3-Matrizen bekomme ich die richtige Ausgabe,

    pthread_t* threads = malloc(dim * sizeof(pthread_t));
            arg_t* args = malloc(dim* sizeof(arg_t ));
            for(int i=0; i<dim;i++)
            {
                args[i].dim = dim;
                args[i].col = i;
                args[i].a = a;
                args[i].b = b;
                args[i].c = c;
    
                int rc = pthread_create(&threads[i], NULL, shm_mm, &args[i]);
            }
            for(int i=0;i<dim;i++)
            {
                pthread_join(threads[i],NULL);
            }
    
            free(threads);
            free(args);
    

    Dieser Teil ist neu für mich und ich würde gern wissen, ob ich da irgendwas falsch mache.


Anmelden zum Antworten