Matrizenmultiplikation mit MPI



  • Hallo Community, ich habe ein Matrizenmultiplikationsprogramm geschrieben, dass ohne MPi nur mit iostream funktioniert. Mit MPI passiert nichts.

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <mpi.h>
    
    #define size 10
    
    using namespace std;
    
    MPI_Status status;
    int world_rank;
    
    void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb);
    
    int main(int argc, char **argv)
    
    {
    	//MPI-Initialisierung
    	MPI_Init(NULL, NULL);
    	int world_size;
    	MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    	MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    
    	int z = 10;
    	int z1 = 10;
    	int z2 = 10;
    
    	int m1[10][10];
    	int m2[10][10];
    
    	srand((unsigned)time(NULL));
    
    	for (int i = 1; i < 10; i++)
    	{
    		for (int j = 1; j < 10; j++)
    		{
    			m1[i][j] = rand() % 10;
    
    		}
    	}
    	srand((unsigned)time(NULL));
    	for (int i = 1; i < 10; i++)
    	{
    		for (int j = 1; j < 10; j++)
    		{
    			m2[i][j] = rand() % 10;
    
    		}
    	}
    
    	matrixmult(m1, m2, z, z1, z2);
    }
    
    void matrixmult(int Ma[size][size], int Mb[size][size], int zeilenmc, int spaltenmc, int zeilenmb)
    {
    	int Em[10][10] = { 0 };
    	if (world_rank == 0)
    	{
    		for (int i = 0; i < zeilenmc; ++i)
    		{
    			for (int j = 0; j < zeilenmb; ++j)
    			{
    
    				for (int k = 0; k < spaltenmc; ++k)
    				{
    					MPI_Send(&Ma[i][j], 1, MPI_INT, 1, 1, MPI_COMM_WORLD);
    					MPI_Send(&Mb[j][k], 1, MPI_INT, 1, 1, MPI_COMM_WORLD);
    					Em[i][k] += Ma[i][j] * Mb[j][k];
    					MPI_Recv(&Em[i][k], 1, MPI_INT, 1, 1, MPI_COMM_WORLD, &status);
    				}
    			}
    
    		}
    	}
    	std::cout << "Endmatrix: " << "[";
    	for (int l = 0; l < size; ++l)
    	{
    		for (int m = 0; m < size; ++m)
    		{
    			std::cout << Em[l][m] << " ";
    		}
    	}
    	std::cout << "]" << endl;
    }
    


  • der Fehler ist anscheinend bei Send oder recv aber ich komm nicht drauf.



  • warum arbeitest du mit MPI? bist du dazu gezwungen?
    wenn nicht, dann rate ich dir, dich zuerst einmal mit C++-grundlagen zu beschäftigen, dann passieren dir solche fehler auch nicht:

    for (int i = 1; i < 10; i++)
        {
            for (int j = 1; j < 10; j++)
            {
          //...
            }
        }
    

    oder so etwas:

    #define size 10
    


  • Ja ich muss mit MPi arbeiten. Und die Fehler sind irrelevant, da das programm mit ihnen auch funktioniert(ohnen mpi).



  • leider scheint es wenig sinnvoll, dir zu antworten.
    wenn du nicht bald anfängst, antworten zu lesen und nicht nur zu überfliegen, wird dir gar keiner mehr antworten.

    PS:
    die Fehler sind irrelevant, da das programm mit ihnen auch funktioniert
    nein



  • Vll will er ja nicht, dass die ersten Werte mit random Zahlen belegt werden.



  • asdfkkk schrieb:

    Vll will er ja nicht, dass die ersten Werte mit random Zahlen belegt werden.

    Ach. und was steht da jetzt drin?



  • Irgendwas, behindert ja den Algo nicht. Das Ergebnis wird nur unbrauchbar sein.



  • Möchtest du damit MPI lernen oder ein brauchbares Programm schreiben? Wenn der zweite Fall gilt, dann würde ich dir strengstens raten eine externe Bibliothek zu nutzen.

    Jetzt rein aus dem Quellcode oben zu urteilen würde ich behaupten du hast wenig Ahnung von Numerik und noch weniger von C++.

    Wenn du unbedingt MPI brauchst dann nimm Pardiso: http://pardiso-project.org/
    Außerdem könntest du dir auch mal Eigen anschauen: http://eigen.tuxfamily.org/index.php?title=Main_Page

    Aus der Historie weiß mann, dass Eigenentwicklungen ohne eine starke Community zu viele Fehler bergen.


Anmelden zum Antworten