2014-02-24 6 views
0

의 수보다이 사소한 일을 할 수 있지만 :버퍼 크기보다 큰 Mpi_send

는 기본으로되는 배열의 크기가 더 이상 카운트 인수보다가 수 MPI_Send (...) 호출에서 버퍼 포인터와 함께 보낼 수 있습니다 ?

MPI_Recv (...)에 관해서는 이것이 합법적이라고 명확하게 명시된 소스를 발견했습니다 (즉, 버퍼가 메시지보다 큽니다).

me 0 0 1 
me 0 1 2 
me 0 2 3 
me 0 3 4 
me 0 4 5 
me 0 5 6 
me 0 6 7 
me 0 7 8 
me 0 8 9 
me 0 9 10 
me 1 0 1 
me 1 1 2 
me 1 2 3 
me 1 3 4 
me 1 4 5 
me 1 5 15 
me 1 6 14 
me 1 7 13 
me 1 8 12 
me 1 9 11 

그러나 내가 가지고 싶습니다 내가 컴파일하고 내가 오류 메시지와 출력을 다음받을 때문에 아래의 프로그램

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

int main(int argc, char **argv){ 
    int i; 

    MPI_Init(&argc, &argv); 

    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
    if(world_size != 2) { 
    printf("You're supposed to use exactly 2 processes, dude!\n"); 
    MPI_Abort(MPI_COMM_WORLD, 0); 
    } 

    int *ids = (int*)(malloc(10*sizeof(int))); 

    if(world_rank == 0) { 
    for(i=0; i<10; i++) 
     ids[i]=i+1; 
    MPI_Send(ids, 5, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    }else{ 
    for(i=0; i<10; i++) 
     ids[i]=20-i; 
    MPI_Recv(ids, 5, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 
    for(i=0; i<10; i++) 
    printf("me %d %d %d\n",world_rank,i,ids[i]); 

    free(ids); 

    MPI_Finalize(); 

    return 0; 
} 

을 실행할 때

플러스, 확인을 것 같다 안심시키기 때문에 아직 안심입니다 ...

+0

그것은 안전 할뿐만 아니라 항상 평소에하는 일입니다. 예를 들어, 배열의 경계에서/recv 고스트 데이터를 보내야 할 때. 또는 2D 배열 행을 보냅니다. 또한 MPI는 MPI 데이터 유형 (예 : 2D 배열 열 보내기)으로/recv 스파 스 버퍼를 보내도록 지원합니다. 그러니 걱정하지 마세요. 코드가 괜찮습니다. – Sigismondo

답변

2

버퍼를 MPI_Send에 전달하고 버퍼의 크기를 알려주므로 버퍼의 크기는 i입니다. t는이다. 커다란 버퍼를 작은 버퍼로 자르고 싶다면 그것은 당신의 비즈니스입니다. MPI_Send은 전달할 버퍼를 할당하거나 생성하는 방법을 알 수 없으며 상관하지 않습니다.

관련 문제