2014-02-24 49 views
0

指望這可能是一件微不足道的小事,但:緩衝區大小大於在MPI_SEND

可以在底層數組的大小比數參數不再與緩衝區指針在MPI_SEND(...)調用一起發送?

至於MPI_Recv(...)我發現明確聲明這是合法的來源(即緩衝區大於消息)。

另外,它似乎是確定,當我編譯,因爲我獲得以下任何錯誤信息輸出運行下面的程序

#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; 
} 

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 

但我想有因爲我仍然是一個新手...

+0

它不僅安全:這是通常做的事情。例如,當您必須在陣列的邊界上發送/ recv幻像數據時。或者您發送一排二維數組。此外,MPI支持使用MPI數據類型發送/接收稀疏緩衝區 - 例如,發送一個2D數組的列。所以不用擔心 - 你的代碼是可以的。 – Sigismondo

回答

2

由於你傳遞一個緩衝區到MPI_Send並告訴它有多大的緩衝區,緩衝區是你說的任何大小我t是。如果你想把一個大緩衝區切割成更小的緩衝區,那就是你的業務。 MPI_Send沒有辦法告訴你如何設法分配或創建你傳遞給它的緩衝區,它並不在乎。