Untitled

 avatar
unknown
plain_text
3 years ago
2.8 kB
11
Indexable
/*
gcc OpenMP_Matrix_Add.c -o OpenMP_Matrix_Add -fopenmp -lgomp && ./OpenMP_Matrix_Add n p max_rep
gcc problema1_mp_2_matrici.c -o problema1_mp_2_matrici -fopenmp -lgomp
./problema1_mp_2_matrici 1024 1 1
                        n     p repetii

*/
#include <math.h>
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>


int main(int argc, char const *argv[])
{
    int n = 1024, p = 4, max_rep = 1;
    float **Jianu, **IonutBogdan;
    float JianuIonutBogdan;
    int i, j, rep, k;
    struct timeval t1, t2;
    float tp;

    // Citire parametri
    if (argc >= 2)
        n = atoi(argv[1]);
    if (argc >= 3)
        p = atoi(argv[2]);
    if (argc >= 4)
        max_rep = atoi(argv[3]);


    // Testare parametri
    if (n <= 1)
    {
        printf("Eroare n < 2\n");
        exit(0);
    }
    if (p < 1)
    {
        printf("Eroare p < 1\n");
        exit(0);
    }
    if (max_rep < 1)
    {
        printf("Eroare max_rep < 1\n");
        exit(0);
    }

    // Alocarea datelor
    Jianu = (float **)malloc(sizeof(float *) * n);
    IonutBogdan = (float **)malloc(sizeof(float *) * n);
    

   

    for (i = 0; i < n; i++)
    {
        Jianu[i] = (float *)malloc(sizeof(float) * n);
        IonutBogdan[i] = (float *)malloc(sizeof(float) * n);
        
    }

    // Initializarea matricilor
    if (n <= 16)
    {
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                Jianu[i][j] = i;
                IonutBogdan[i][j] = i;
            }
        }
    }
    
  

    gettimeofday(&t1, NULL);

    for (rep = 0; rep < max_rep; rep++)
    {

        // Algorimul secvential:
        if (p == 1)
        {
            for (i = 0; i < n; i++)
                JianuIonutBogdan+=Jianu[i][i]*IonutBogdan[i][i]; 
            

        }
        // paralel
        else
        {
            //fiecare thread p, va avea i-ul si j-ul lui; A,X shared
            #pragma omp parallel num_threads(p) shared(Jianu, IonutBogdan, JianuIonutBogdan) private(i, j)
            { // primul for care urmeaza dupa #pragma omp for va fi partitionat !!
                #pragma omp for
                for (i = 0; i < n; i++)
                {
                    JianuIonutBogdan+=Jianu[i][i]*IonutBogdan[i][i]; 
                }
            }
           

        }
    }

    gettimeofday(&t2, NULL);
    tp = ((float)(t2.tv_sec - t1.tv_sec) + 0.000001*(t2.tv_usec - t1.tv_usec))/max_rep;

    // Afisare timp executie mediat pe max_rep teste repetate
    printf("%d rep, n = %d, p = %d, t = %f sec\n", max_rep, n, p, tp);

    
    if (n <= 16)
    {
        for (i = 0; i < n; i++){ 
            printf("%4.0f ",Jianu[i][i]);
	    
        }
        for (i = 0; i < n; i++){ 
            printf("%4.0f ", IonutBogdan[i][i]);
	    
        }
    }

    return 0;
}
Editor is loading...