2013-12-17 2 views
0

Надеюсь, кто-то может мне помочь. Мой код:неожиданный тупик в 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 ......

+0

ли они определены в любом месте? 'int ASpalten, AZeilen, BSpalten;' –

+0

Вместо этого вы решили использовать 'MPI_Bcast'? –

ответ

1

кажется, что процесс 0 посылает сообщения срабатывать 0 и прок 0 делает их получение.

Я изменил к

for(i=1;i<numprocs;i++) 

, чтобы удалить из тупика.

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <string.h> 
#include "mpi.h" 


int ASpalten; 
int AZeilen; 
int BSpalten; 
int *meta; //used to transfer meta data in 1 send 
double *MA; //Matrix A 
double *MB; //Matrix B 
double *MR; //Matrix B 

void process(int myid, int numprocs){ 
    int i,j, anzahl, rest; 
    int TAG=0; 
    MPI_Status stat; 
    meta=(int*)malloc(3*sizeof(int)); 
    if(myid == 0) 
    {meta[0]=ASpalten; 
    meta[1]=AZeilen; 
    meta[2]=BSpalten; 
    for (i=1; 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 
    } 
} 

int main(int argc,char *argv[]) 
{ 
    int rank, size; 


    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    ASpalten=130; 
    AZeilen=90; 
    BSpalten=200; 
    if(rank==0){ 

    } 

    MA = (double*)malloc(ASpalten*AZeilen*sizeof(double)); 
    MB = (double*)malloc(ASpalten*BSpalten*sizeof(double)); 
    MR = (double*)malloc(AZeilen*BSpalten*sizeof(double)); 
    process(rank,size); 
    MPI_Finalize(); 
    return 0; 
} 

Bye,

Фрэнсис

+0

Спасибо за ваш ответ Фрэнсис. Я проверю его как можно скорее. Но не должна ли программа всегда заходить в тупик, если это проблема? Я изменил его раньше на 0, чтобы предотвратить тупик, когда у меня было много ошибок в моей программе, и я не знаю, почему это вызвало проблему. Надеюсь, завтра это сработает. – user1497119

+0

@ user1497119: Я не знаю, почему i = 0 работает на небольших размерах и почему он терпит неудачу при больших размерах. Я смог воспроизвести вашу проблему и изменился, так как i = 1 решил ее. Я полагаю, что сообщения не обрабатываются одинаково в зависимости от их размера (внутренние особенности реализации MPI?). Надеюсь, это поможет! Bye, Francis – francis

+0

'MCA btl: параметр" btl_self_eager_limit "(текущее значение: <131072>, источник данных: значение по умолчанию)' - поэтому он «работает» с меньшими матрицами. –

Смежные вопросы