Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2009, 18:06   #11
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

касательно задания матрица не квадратная и количество процессов эквивалентно количеству строк.
что прога дает при матрице 5 на 5 и при 5-и процессах??
(сам не могу проверить, т.к. сижу на компе без сишки)
BleStaR вне форума Ответить с цитированием
Старый 24.12.2009, 19:09   #12
mages
 
Регистрация: 23.12.2009
Сообщений: 9
По умолчанию

матрица квадратная, значение N=M в данном случае.
а кол-во процессов должно быть кратно N. т.е. если процессов 6 то матрица должна быть соответственно 2 на 2 ,3 на 3 и 6 на 6.
если процессов 4 то 4на4 и 2на2.
если 5 то 5на5 только.
а вот если взять количество процессов 6 и матрицу 3 на 3 , то программа не может найти максимальные элементы в строках матрицы. аналогично если процессов 8 то не может найти в матрице 4на4 и 2на2.
mages вне форума Ответить с цитированием
Старый 24.12.2009, 19:13   #13
mages
 
Регистрация: 23.12.2009
Сообщений: 9
По умолчанию

находит только тогда когда N равно кол-ву процессов.
mages вне форума Ответить с цитированием
Старый 24.12.2009, 19:47   #14
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Первое: прога скорее всего и не должна работать при N меньшем количества процессов. Т.к. MPI_Scatter раздает части твоего массива процессам, а ведь строк меньше чем процессов! Вопрос что получат остальные? На это я ответить пока не могу(возьможно NULL -что вызывает ошибки, которые обрабатываются самой функцией, поэтому тебе про них не говорят). Но ошибка явно в этом!
Второе:
По заданию N кратно количеству процессов - если не изменяет память, и здравый смысл, то вроде бы N должно делится на цело на количество процессов. Т.е. N больше количества процессов. Например Строк 8 процессов 4,2,1.
BleStaR вне форума Ответить с цитированием
Старый 24.12.2009, 19:52   #15
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Ну и касательно того случая когда количество процессов будет меньше чем количество строк.
Тебе надо будет организовать систему которая следила бы за тем какой из процессов закончил свою работу, и снова его загрузить.
BleStaR вне форума Ответить с цитированием
Старый 25.12.2009, 10:30   #16
mages
 
Регистрация: 23.12.2009
Сообщений: 9
По умолчанию

Иправил прогу.
при равном находит нормально N равно процессам.
а при 3х процессах и матрице 6на6 находит неправильно.
кажетс ошибка в МПИ_Скаттере либо в чунке
mages вне форума Ответить с цитированием
Старый 25.12.2009, 10:54   #17
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Выложи исправленый вариант. Возможно ты прав по поводу скатерра. Пробовал отследить прием-оправку?
BleStaR вне форума Ответить с цитированием
Старый 25.12.2009, 17:56   #18
mages
 
Регистрация: 23.12.2009
Сообщений: 9
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <mpi.h>


void Init(FILE *f, int m,int n, double *B)
{int i,j; 
 for(i=0;i<m;i++) {
 for(j=0;j<n;j++)fscanf(f,"%lf",&B[i*m+j]);}
 fscanf(f,"\n"); 
 for(i=0;i<m;i++)
 {
  for(j=0;j<n;j++)
  printf("%4.lf",B[i*m+j]);
  printf("\n");
 }
}
  

  double Max( double *B,int m,int n)
{
 int i,j;
 double  max1;
 for(i = 0; i < n*chunk;) { 
 max1=B[0];
 for(j=i;j<=n;j++) if(B[j]>max1) max1=B[j];
 i=i+n;
 printf("max %i Stroki=%lf\n",rk*chunk+i,max1);
 }
 }  
  
  void print(double *B,int m,int n)
  {
   int i,j;
   for(i=0;i<m;i++){  
   for(j=0;j<n;j++) printf("%4.0lf",B[i*m+j]); printf("\n");
  }
 }
  
 
  int main (int argc,char *argv[])
  { 
   FILE *f=fopen("input.txt","r");
   int i,np,rk,m,n,chunk=1; 
   double *B,*Bloc,t;
  
  MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD,&np);
  MPI_Comm_rank(MPI_COMM_WORLD,&rk);
  if(rk==0)
  { 
   fscanf(f,"%d ",&m); fscanf(f,"%d\n",&n);
   chunk=m/np;
   B=(double *)malloc(m*n*sizeof(double));
  }
  MPI_Bcast(&m,1, MPI_INT,0, MPI_COMM_WORLD);
  MPI_Bcast(&chunk,1, MPI_INT,0, MPI_COMM_WORLD);
  Bloc=(double *)malloc(chunk*n*sizeof(double));
  
  if (rk==0)
  {
   Init(f,m,n,B);
   t=MPI_Wtime();
  }
  MPI_Scatter(B,m*chunk,MPI_DOUBLE,Bloc,m*chunk,MPI_DOUBLE,0,MPI_COMM_WORLD);
  Max(Bloc,chunk,n);
  MPI_Gather(Bloc,m*chunk,MPI_DOUBLE,B,m*chunk,MPI_DOUBLE,0,MPI_COMM_WORLD);
  
  if(rk==0)
  {
   t=MPI_Wtime()-t;
   printf("%lf sec. \n",t);
   }
   return 0;
}
mages вне форума Ответить с цитированием
Старый 25.12.2009, 17:59   #19
mages
 
Регистрация: 23.12.2009
Сообщений: 9
По умолчанию

теперь программа требует маленькой доработки.
поиск,когда N кратно процессам и не равно. при 2х процессах матрице 6на6 или 4на4.
mages вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стандартная сортировка пузырьком. параллельное программирование. lamont61 Помощь студентам 2 11.12.2009 15:12
Параллельное программирование Renegad Фриланс 5 10.06.2008 18:11
Реализация модели эволюции клетки. Параллельное программирование на языке с. Заноза Помощь студентам 4 03.04.2008 22:13
Параллельное программирование Ugly Win Api 7 16.03.2008 15:33