Форумчанин
Регистрация: 16.01.2011
Сообщений: 168
|
guimpirun не запускает приложение
Код:
#include <iostream>
#include <mpi.h>
using namespace std;
int main (int argc, char* argv[])
{
int d, m; //d - количество строк матрицы, которые получит каждый процесс, m - остаток строк матрицы, будет распределено по процессам (кроме 0-го процесса)
int ** A; //A*b = c
int * b, * c;
int * a;
int Rank, kp, N;
int ic[2];
MPI_Status cStatus;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &kp);
MPI_Comm_rank(MPI_COMM_WORLD, &Rank);
if(Rank == 0)
{
cout << "Enter N: "; cin >> N;
d = N/kp;
m = N%kp;
A = new int * [N];
b = new int[N];
c = new int[N];
for( int i = 0; i < N; i++ )
{
A[i] = new int[N+1];
A[i][0] = i;
}
cout << "b:" << endl;
for( int i = 0; i < N; i++ )
{
b[i] = rand() % 100;
if( b[i] / 10 == 0)
{
cout << b[i] << " ";
}
else
{
cout << b[i] << " ";
}
}
cout << endl;
cout << "A:" << endl;
for(int j = 0; j < N; j++)
{
for(int i = 1; i < N+1; i++)
{
A[j][i] = rand() % 100;
if(A[j][i] / 10 == 0)
{
cout << A[j][i] << " ";
}
else
{
cout << A[j][i] << " ";
}
}
cout << endl;
}
int index_vec = d;
for( int i = 0; i < d; i++ )
{
c[i] = 0;
for( int p = 1; p < N+1; p++ )
{
c[i] += A[i][p]*b[p-1];
}
}
for( int i = 1; i < kp; i++ )
{
MPI_Send(&N, 1, MPI_INT, i, 99, MPI_COMM_WORLD);
MPI_Send(b, N, MPI_INT, i, 99, MPI_COMM_WORLD);
for( int j = 0; j < d; j++ )
{
MPI_Send(A[index_vec], N+1, MPI_INT, i, 99, MPI_COMM_WORLD);
index_vec++;
}
}
cout << m;
for( int i = 1; i <= m; i++ )
{
MPI_Send(A[index_vec], N+1, MPI_INT, i, 99, MPI_COMM_WORLD);
index_vec++;
}
for( int i = 0; i < N - d; i++ )
{
MPI_Recv(ic, 2, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &cStatus);
c[ic[0]] = ic[1];
}
for( int i = 0; i < N; i++ )
{
cout << c[i] << " ";
}
}
else
{
MPI_Recv(&N, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &cStatus);
d = N/kp;
m = N%kp;
b = new int[N];
a = new int[N+1];
MPI_Recv(b, N, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &cStatus);
for(int i = 0; i < d; i++)
{
MPI_Recv(a, N+1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &cStatus);
ic[0] = a[0];
ic[1] = 0;
for( int i = 0; i < N; i++)
{
ic[1] += b[i]*a[i+1];
}
MPI_Send(ic, 2, MPI_INT, 0, 99, MPI_COMM_WORLD);
}
if(Rank <= m)
{
MPI_Recv(a, N+1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &cStatus);
ic[0] = a[0];
ic[1] = 0;
for( int i = 0; i < N; i++)
{
ic[1] += b[i]*a[i+1];
}
MPI_Send(ic, 2, MPI_INT, 0, 99, MPI_COMM_WORLD);
}
}
MPI_Finalize();
return 0;
}
Написал распараллеливание операции - умножения матрицы на вектор (не знаю правильно или нет, кажется что не верно, т.к. с mpi до этого не работал)
Запускаю так: mpirun -np N myprogram.exe всё нормально работает, но через guimpirun ничего не запускается, в чем может быть проблема? Возможно, я программу неправильно написал.
|