Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C++] e OpenMP

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    8

    [C++] e OpenMP

    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();    
        };

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    8
    up !

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.