Официальный сайт студ.городка НГТУ
Программирование и БД » [C++, MPICH] Как передать динамический массив при помощи MPI_Send? 

#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

#2  17.03.11 01:14

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Banzzaj, выделяй массив одним куском памяти. В чем проблема-то?
Так оно и быстрее будет(обращение к элементам).

Исправлено Revenger (17.03.11 01:21)

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

#4  17.03.11 12:10

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Дональдак написал(а):

отдаешь двойной указатель

лол))))

Revenger, это обход проблемы. меня интересует можно ли, а не как лучше :\

Offline

#5  17.03.11 13:03

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Ты придумываешь проблему на ровном месте.
З.Ы. Вопрос в другом - нафига оно тебе нужно.

Исправлено Revenger (17.03.11 14:12)

Offline

#6  17.03.11 14:47

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Revenger, посты читаешь мои?

Offline

#7  17.03.11 14:55

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

конкретно send-ом этого сделать нельзя. Ты сам посмотри какую структуры данных ты передаешь.

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

#9  17.03.11 16:00

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Revenger, благодарю.
Flinn, да можно вообще без массива сделать, дело не в том..

Offline

#10  17.03.11 16:03

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Banzzaj, ты вот только скажи  - это чисто академический спортивный интерес?

Offline

#11  17.03.11 16:04

Re: [C++, MPICH] Как передать динамический массив при помощи MPI_Send?

Revenger, да)

Offline

Программирование и БД » [C++, MPICH] Как передать динамический массив при помощи MPI_Send? 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.042 сек.
Выполнено 14 запросов.