2013-02-22 4 views
1

나는이 프로젝트에 관한 질문을 조금 전에 물어 보았습니다. 새로운 문제가 생겼습니다. MPI_cart_shift를 실행하여 현재 프로세스에 가장 가까운 이웃을 찾으면 올바른 대상 순위를 얻지 못합니다.MPI_Cart_shift가 이웃을 돌려 보내지 않음

이 예제 코드를 따르려고합니다. http://siber.cankaya.edu.tr/ozdogan/GraduateParallelComputing.old/ceng505/node133.html

여기

MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ 
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ 
. 
. 
. 

if(is_perfect_square(size)) dim_size[0] = dim_size[1] = (int) sqrt(size); 
else 
{ //if size = 2 then dims = 2, 1; size = 4 then 2,2; 8 = 4, 2... 
    dim_size[0] = (int) sqrt(size + size); 
    dim_size[1] = dim_size[0]/2; 
} 
fprintf(stderr, "%d | %d \n", dim_size[0], dim_size[1]); 
MPI_Cart_create(MPI_COMM_WORLD, 2, dim_size, periods, 1, &CannonsCart); 
MPI_Barrier(MPI_COMM_WORLD); 
. 
. 
. 
runCannon(CannonsCart, &a, &b, &c); 

여기가 runCannon의 좌표 시스템을 만들기위한 내 코드입니다.

int runCannon(MPI_Comm comm, Matrix *a, Matrix *b, Matrix *c) 
{ 

    int size, rank, coordinates[2]; 
    int uprank, downrank, leftrank, rightrank; 
    int shiftsource, shiftdest; 
    int ix, swap; 
    MPI_Status status; 

    MPI_Comm_size(comm, &size); 
    MPI_Comm_rank(comm, &rank); 
    MPI_Cart_coords(comm, rank, 2, coordinates); 

    MPI_Cart_shift(comm, 0, -1, &rightrank, &leftrank); //Cart_shift is doing weird stuff that I don't understand. 
    MPI_Cart_shift(comm, 1, -1, &downrank, &uprank); 



    printf("rank = %d, rightrank = %d, downrank = %d, leftrank = %d, uprank = %d\n", rank, rightrank, downrank, leftrank, uprank); 

각각 4, 8, 16 개의 프로세스로 프로그램을 실행하면 이러한 출력이 발생합니다.

rank = 0, rightrank = 2, downrank = 1, leftrank = 2, uprank = 1 
rank = 1, rightrank = 3, downrank = 0, leftrank = 3, uprank = 0 
rank = 3, rightrank = 1, downrank = 2, leftrank = 1, uprank = 2 
rank = 2, rightrank = 0, downrank = 3, leftrank = 0, uprank = 3 

0 등 rightrank = 1, downrank = 2, 왼쪽 순위 = 1, uprank = 2,해야 난 그냥 8 개 프로세스가있는 경우이 내 출력 때문에 MPI_shift 그러나 전화 교환 수 없습니다.

rank = 0, rightrank = 2, downrank = 1, leftrank = 6, uprank = 1 
rank = 1, rightrank = 3, downrank = 0, leftrank = 7, uprank = 0 
rank = 2, rightrank = 4, downrank = 3, leftrank = 0, uprank = 3 
rank = 3, rightrank = 5, downrank = 2, leftrank = 1, uprank = 2 
rank = 4, rightrank = 6, downrank = 5, leftrank = 2, uprank = 5 
rank = 5, rightrank = 7, downrank = 4, leftrank = 3, uprank = 4 
rank = 6, rightrank = 0, downrank = 7, leftrank = 4, uprank = 7 
rank = 7, rightrank = 1, downrank = 6, leftrank = 5, uprank = 6 

0은 데이터를 위하여 여기 rightrank = 1 downrank = 4 leftrank = 3 = 4 uprank

및 16 개를 가져야한다.

rank = 9, rightrank = 13, downrank = 10, leftrank = 5, uprank = 8 
rank = 3, rightrank = 7, downrank = 0, leftrank = 15, uprank = 2 
rank = 0, rightrank = 4, downrank = 1, leftrank = 12, uprank = 3 
rank = 2, rightrank = 6, downrank = 3, leftrank = 14, uprank = 1 
rank = 1, rightrank = 5, downrank = 2, leftrank = 13, uprank = 0 
rank = 8, rightrank = 12, downrank = 9, leftrank = 4, uprank = 11 
rank = 6, rightrank = 10, downrank = 7, leftrank = 2, uprank = 5 
rank = 7, rightrank = 11, downrank = 4, leftrank = 3, uprank = 6 
rank = 4, rightrank = 8, downrank = 5, leftrank = 0, uprank = 7 
rank = 5, rightrank = 9, downrank = 6, leftrank = 1, uprank = 4 
rank = 12, rightrank = 0, downrank = 13, leftrank = 8, uprank = 15 
rank = 14, rightrank = 2, downrank = 15, leftrank = 10, uprank = 13 
rank = 13, rightrank = 1, downrank = 14, leftrank = 9, uprank = 12 
rank = 10, rightrank = 14, downrank = 11, leftrank = 6, uprank = 9 
rank = 11, rightrank = 15, downrank = 8, leftrank = 7, uprank = 10 
rank = 15, rightrank = 3, downrank = 12, leftrank = 11, uprank = 14 

답변

0

올바른 출력을 얻으려면 두 가지를 변경해야합니다. 첫째, 내 기본 코드에서 내가 지금, dim_size의 행과 열을 교환하는 데 필요한 :

else 
{ //if size = 2 then dims = 2, 1; size = 4 then 2,2; 8 = 4, 2... 
    dim_size[1] = (int) sqrt(size + size); 
    dim_size[0] = dim_size[1]/2; 
} 

옆, 정말, 내 MPI_Cart_shift 통화를 교환하는 데 필요한 :

MPI_Cart_shift(comm, 1, -1, &rightrank, &leftrank); 
MPI_Cart_shift(comm, 0, -1, &downrank, &uprank);