PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 19 ноя 18 4:21

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Ошибка при использовании scatterv
СообщениеДобавлено: 18 фев 12 13:30 
Не в сети

Зарегистрирован: 18 фев 12 13:17
Сообщения: 1
Доброго всем времени суток

Никак не получается верно раскидать двумерный массив по процессам с помощью scatterv
Использую scatterv, т.к. на процессы с рангом больше 0, хочу раздать помимо их "доли" строк, еще и последнюю строку от части массива, которую кидаю предыдущему процессу...
:?:
но где-то я заблудился

Код:
#include "mpi.h"
#include <iostream>

using namespace  std;

const int n = 10, m = 5;
int main( int argc, char* argv[] )
{
    int i;
    int rank, nproc;
   int array_2d[n][m];

       
       
        for (int i = 0; i < n; i++)   
        {
            for (int j = 0; j < m; j++)   
            {
                array_2d[i][j]=0;
                }
                }
       

             for (int i = 0; i < n; i++)   
             {
            for (int j = 0; j < m; j++)   
            {
                if(i%2==0){ if(j%2==0) array_2d[i][j]=1;}
                if(i%2) {if(j%2)array_2d[i][j]=-1;}
                }
                }
       
          for (int i = 0; i < n; i++)   
             {
            for (int j = 0; j < m; j++)   
            {
               
                cout << array_2d[i][j] << "\t";
                }
                cout << "\n";
                }

   
   
    MPI_Init( &argc, &argv );
    MPI_Comm_size( MPI_COMM_WORLD, &nproc );
    MPI_Comm_rank( MPI_COMM_WORLD, &rank );

   const int s = n/nproc;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    int *iscnt = new int[nproc];
    int *irdisp = new int[nproc];

    for(int i=0;i<n;i++)
    {
       iscnt[i] = s*m;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       irdisp[i] = rank*s*m;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    }
   int *irecv=new int[m*s];//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   int  ircnt = m*s;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   

    MPI_Scatterv( array_2d, iscnt, irdisp, MPI_INTEGER, irecv, ircnt,
                             MPI_INTEGER, 0, MPI_COMM_WORLD);
    for(i=0; i<ircnt; i++)
    {
    for (int j = 0; j < m; j++)   
            {
                 
                   cout << "rank =  " << rank <<  " irecv =   " <<  irecv[i*m+j];
            }
           
            cout << "\n";
    }

   
    MPI_Finalize();
   cin.get();
}


или как-то можно не через scatterv это реализовать???

Заранее спасибо....


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB