#1 16.03.11 23:48
[C++, MPICH] Как передать динамический массив при помощи MPI_Send?
Доброго вечера, уважаемые.
Требуется передать содержимое динамического двумерного массива от процесса к процессу.
Пытался использовать MPI_Send как при пересылке обычных данных, но возникла проблема:
первым параметром должен быть указатель на непрерывную область памяти, что не получается при передачи динамического массива.. Есть идеи как заставить сие работать? Кроме отправки пакетом(MPI_PACKED)?
вот так выглядит сейчас:
Код: cpp:
double **B; B = new double *[M]; for (i=0; i<M; ++i) B[i] = new double[maxN]; MPI_Send(B, maxN*M, MPI_DOUBLE, 1, MPI_ANY_TAG, MPI_COMM_WORLD);
Offline
#3 17.03.11 08:12
Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?
Banzzaj, у тебя какая-то ерунда получилась.
Прототип функции:
Код: cpp:
int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )
Ты ей отдаешь двойной указатель, поэтому результат уже неверный.
Чтобы сделать как ты хочешь:
Код: cpp:
/* создание */ double *B = new double[M * maxN]; if (!B) { ... } /* обращение к элементам */ for (int i = 0; i < M; ++i) for (int j = 0; j < maxN; ++j) B[i * M + j] = i * M + j; MPI_Send(B, maxN * M, MPI_DOUBLE, 1, MPI_ANY_TAG, MPI_COMM_WORLD);
Кстати, разве до send'а не надо звать mpi_init? Сам этого не знаю.
Исправлено Дональдак (17.03.11 08:12)
Offline
#8 17.03.11 15:03
Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?
Banzzaj, а если без динамического выделения?
const unsigned __int32 N = 21; // размерность матрицы
const unsigned __int32 M = 7; // размерность ленты (имеем 3 ядра 21 / 3 = 7)
double B[N][M]; // для каждого потока свой кусок матрицы B
size_t prev = ( myRank - 1 + numProcs ) % numProcs;
size_t next = ( myRank + 1 + numProcs ) % numProcs;
for ( unsigned __int32 k = 0; k < numProcs; ++k ) // количество блоков
{
// бла бла бла
MPI_Send( B, M * N, MPI_DOUBLE, prev, 15, MPI_COMM_WORLD);
MPI_Recv( B, M * N, MPI_DOUBLE, next, 15, MPI_COMM_WORLD, &st);
};
Исправлено Flinn (17.03.11 15:03)
Offline

