Надеюсь, кто-то может мне помочь. Мой код:неожиданный тупик в MPI
void process(int myid, int numprocs)
{
int i,j, anzahl, rest;
MPI_Status stat;
meta = (int *)malloc(3 * sizeof(int));
if(myid == 0)
{
meta[0] = ASpalten;
meta[1] = AZeilen;
meta[2] = BSpalten;
for (i = 0; i < numprocs; i++) //masternode distributes matrix A to every single core
{
MPI_Send(&meta[0], 3, MPI_INT, i, TAG, MPI_COMM_WORLD);
printf("%d: debug04\n", myid);
MPI_Send(&MA[0], ASpalten*AZeilen, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD);
printf("%d: debug05\n", myid);
MPI_Send(&MB[0], ASpalten*BSpalten, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD);
printf("%d: debug06\n", myid);
}
}
else
{
MPI_Recv(meta, 3, MPI_INT, 0, TAG, MPI_COMM_WORLD, &stat);
printf("%d: debug01\n", myid);
ASpalten = meta[0];
AZeilen = meta[1];
BSpalten=meta[2];
printf("%d: debug02\n", myid);
MA = (double*)malloc(ASpalten*AZeilen*sizeof(double));
MB = (double*)malloc(ASpalten*BSpalten*sizeof(double));
MR = (double*)malloc(AZeilen*BSpalten*sizeof(double));
MPI_Recv(MA, ASpalten*AZeilen, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat);
MPI_Recv(MB, ASpalten*BSpalten, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat);
printf("%d: debug03\n", myid);
// printf("%d: %f\n", myid, *(MA + _index(1, 1, ASpalten))); //funktioniert
}
В Datatypes:
int ASpalten;
int AZeilen;
int BSpalten;
int *meta; //used to transfer meta data in 1 send
double *MA; //Matrix A
double *MB; //Matrix B
Программа должна умножать 2 матрицы с использованием MPI. Моя типовая матрица доказывает, что код, скорее всего, действителен, и я также получаю этот запуск до 130 * 90
матриц (возможно, может быть, меньше), но в любом случае, как только число увеличивается, я получаю возможный тупик: консоль печатает "debug4"
и все. Я был бы очень благодарен, если кто-нибудь подскажет, что происходит в моей программе. Я уже пытался использовать MPI_INTEGER
вместо MPI_INT
, но нет никакой разницы. Любая помощь будет оценена по достоинству. Выход консоли при использовании очень маленькие матрицы (PS, я уже пытался выполнить мои testcases в различных порядках тоже и модифицированные уже существующие):
Testcase1 MPI:
0: debug04
0: debug05
0: debug06
0: debug04
1: debug01
1: debug02
0: debug05
1: debug03
1:debugx 0: debug06
0: debug04 ......
ли они определены в любом месте? 'int ASpalten, AZeilen, BSpalten;' –
Вместо этого вы решили использовать 'MPI_Bcast'? –