2014-02-24 3 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

Это не только безопасно: это то, что принято делать все время. Например, когда вам нужно отправлять/возвращать данные призраков на границу массива. Или вы отправляете строку 2D-массива. Кроме того, MPI поддерживает отправку/recv разреженных буферов с использованием типов данных MPI - например, отправку столбца 2D-массива. Так что не волнуйтесь - ваш код в порядке. – Sigismondo

ответ

2

Поскольку вы передаете буфер MPI_Send и рассказываете, насколько велик буфер, буфер - это любой размер, который вы говорите i t есть. Если вы хотите вырезать большой буфер в более мелкие буферы, это ваш бизнес. MPI_Send не может сказать, как вам удалось выделить или создать буфер, который вы передаете ему, и ему все равно.

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