Untitled
unknown
plain_text
4 years ago
2.8 kB
18
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...