Salve a tutti.
Sto scrivendo a titolo d'esempio un programma che gestisca bene la cache e che faccia uso della libreria di openmp (omp.h) per la parallellizzazione del codice.
Come esempio ho proposto un prodotto tra due matrici dello stesso ordine
L'uso utile della cache l'ho esplementato trasponendo una delle due matrici in modo tale da non fare un prodotto righe per colonne (che farebbe saltare continuamente tra una linea di cache e un altra). Il prodotto risulta essere riga per riga (in modo tale da accedere ad aree contigue di memoria.
Il problema adesso sono i cicli for. Per parallellizzare un ciclo for basta dare la direttiva:
#pragma omp for
Però non funziona quando i cicli for sono annidati uno dentro l'altro.
Lascio scritto il codice sperando che qualcuno riesca a chiarirmi come poter parallellizzare cicli for annidati:
codice:
#include<iostream>
#include<math.h>
#include<omp.h>
using namespace std;
double funz()
{
int o;
cout << "Dammi l'ordine della tua prima matrice: ";
cin >> o;
double **M1, **M2, **M2T, **MT;
M1= new double*[o];
M2= new double*[o];
M2T= new double*[o];
MT= new double*[o];
#pragma omp for
for(int i = 0; i < o; i++)
{
M1[i] = new double[o];
M2[i] = new double[o];
M2T[i]= new double[o];
MT[i]= new double[o];
};
double val;
cout << "Inserire gli elementi della prima matrice" << endl;
#pragma omp for
for(int k=0; k<o ; k++)
{
for(int l=0; l<o; l++)
{
cout << "Riga " << k+1 << " Colonna " << l+1 << ": " ;
cin >> val;
M1[k][l]=val;
};
};
cout << "Inserire gli elementi della seconda matrice" << endl;
#pragma omp for
for(int k=0; k<o ; k++)
{
for(int l=0; l<o; l++)
{
cout << "Riga " << k+1 << " Colonna " << l+1 << ": " ;
cin >> val;
M2[k][l]=val;
};
#pragma omp for
for(int i=0; i<o; i++)
{
for (int k=0; k<o; i++)
{M2T[i][k]=M2[k][i];};
};
#pragma omp for
for(int i=0; i<o ; i++)
{
for(int k=0; k<o; k++)
{
MT[i][k]=(M1[i][k]*M2T[i][k]);
};
};
cout << " Il prodotto delle due matrici è: " << endl;
#pragma omp for
for(int i=0; i<o; i++)
{
cout << MT[i]<< " "<< "\n" << endl;
};
}
};
int main()
{
funz();
};