Untitled
unknown
plain_text
4 years ago
3.6 kB
11
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#include <math.h>
#include <omp.h>
int main(int argc, char *argv[]){
int n = 1024; // Dimensiune matrice
int p = 1; // Numar thread-uri
int mod = 0; // Mod 0: partitionare pe linii
int max_rep = 1; // Numar de repetari ale executiei
float **a, *b, *c; // Matricele de date
int i, j, k, t, f, d, rep;
char *text_mod;
struct timeval t1, t2;
float tp;
char *fn = "Res_Matrix_Mult_OpenMP.txt";
FILE *fp;
// Citire parametri
if (argc >= 2) n = atoi(argv[1]);
if (argc >= 3) p = atoi(argv[2]);
if (argc >= 4) mod = atoi(argv[3]);
if (argc >= 5) max_rep = atoi(argv[4]);
// Testare parametri
if (n < 2){
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);
}
// La partitionare in blocuri: p patrat perfect, n divizibil cu sqrt(p)
if (mod == 5){
if (sqrt(p) != (int)sqrt(p)) {
printf("Eroare: partitionare in blocuri (mod = %d) si p nu este patrat perfect\n",mod);
exit(0);
}
if (n % (int)sqrt(p) != 0) {
printf("Eroare: partitionare in blocuri (mod = %d) si n nu este divizibil cu sqrt(p)\n",mod);
exit(0);
}
}
f = sqrt(p);
d = n/f;
// Alocarea datelor
a = (float**)malloc(sizeof(float*)*n);
b = (float*)malloc(sizeof(float)*n);
c = (float*)malloc(sizeof(float)*n);
for (i = 0; i < n; i++){
a[i] = (float*)malloc(sizeof(float)*n);
}
// Initializare matrice a, b
for (i = 0; i < n; i++){
b[i] = 1;
for (j = 0; j < n; j++) {
a[i][j] = 1;
}
}
gettimeofday(&t1, NULL);
for (rep = 0; rep < max_rep; rep++){
if (p == 1) {
// Adunarea secventiala a doua matrice
text_mod = "Adunare secventiala";
for (i = 0; i < n; i++){
c[i]= 0;
for (j = 0; j < n; j++){
c[i] += a[i][j] * b[j];
}
}
}
// Adunarea paralela a doua matrice
else if (mod == 0) {
text_mod = "mod 0: Adunare paralela cu partitionare pe linii cu 1 regiune paralela";
#pragma omp parallel num_threads(p) shared (a, b, c, n) private (i, j)
{
#pragma omp for
for (i = 0; i < n; i++){
c[i]= 0;
for (j = 0; j < n; j++){
c[i] += a[i][j] * b[j];
}
}
}
}
else {
printf("Eroare: mod %d - inexistent\n", mod);
exit (0);
}
} // end for (rep)
gettimeofday(&t2, NULL);
tp = ((float)(t2.tv_sec - t1.tv_sec) + 0.000001*(t2.tv_usec - t1.tv_usec))/max_rep;
// Scriere timp de executie in fisier
fp = fopen(fn, "a");
if (p == 1) fprintf(fp, "\n%f ",tp);
else fprintf(fp, "%f ",tp);
fclose(fp);
// Afisare timp executie mediat pe max_rep teste repetate
printf("%s \n", text_mod);
printf("%d rep, n = %d, p = %d, t = %f sec\n", max_rep, n, p, tp);
// Afisare rezultate
if (n <= 16)
{
for (i = 0; i < n; i++){
printf("%4.0f ", c[i]);
}
printf("\n");
}
return 0;
}Editor is loading...