0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
1

Ленточное умножение матриц с использованием MPI

21.05.2012, 16:10. Показов 9097. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться, почему в результирующей матрице С диагональные элементы считаются неправильно? Код взят отсюда.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
void InitProcess (double* &A,double* &B,double* &C ,int &Size) {
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
if (ProcRank == 0) {
do {printf("n–matrix multiplication–");
  Size = 4;  
  if (Size< ProcNum) printf("Matrix size is less than the number of processes! n");
  if (Size%ProcNum!=0) printf("Matrix size should be dividable by the number of processes! n");
}
 while ((Size< ProcNum)||(Size%ProcNum!=0));
}
if (Size<3) flag=1;
MPI_Bcast(&Size, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
if (ProcRank == 0) {
  A = new double [Size*Size];
  B = new double [Size*Size];
  C = new double [Size*Size];
  RandInit (A, Size); RandInit (B, Size);//Инициализация матриц
 }
}
//————————————————-
void Flip (double *&B, int dim) { 
double temp=0.0; 
  for (int i=0;i<Size;i++){
      for (int j=i+1;j<Size;j++)
        temp=B[i*dim+j],
        B[i*dim+j]=B[j*dim+i],
        B[j*dim+i]=temp;
  }
}
//————————————————-
void MatrixMultiplicationMPI(double *&A, double *&B, double *&C, int &Size) {
 int dim =Size;
 int i, j, k, p, ind;
 double temp;
 MPI_Status Status;
  int ProcPartSize=dim/ProcNum;//Количество подзадач
  int ProcPartElem=ProcPartSize*dim;//Количество элементов в подзадаче
 double* bufA=new double[dim*ProcPartSize];
 double* bufB=new double[dim*ProcPartSize];
 double* bufC=new double[dim*ProcPartSize];
  int ProcPart = dim/ProcNum, part = ProcPart*dim;
 if (ProcRank == 0) {
 Flip(B,Size);//Транспонирование матрицы В
 }
 
 MPI_Scatter(A, part, MPI_DOUBLE, bufA, part, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 MPI_Scatter(B, part, MPI_DOUBLE, bufB, part, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 
 temp=0.0;
 for(i=0;i<ProcPartSize;i++){  
     for(j=0;j<ProcPartSize;j++){
         for(k=0;k<dim;k++)
        temp += bufA[i*dim+k]*bufB[j*dim+k],
        bufC[i*dim+j+ProcPartSize*ProcRank]=temp,
         temp=0.0;
     }
 }
 
  int NextProc; int PrevProc;
 for(p=1;p<ProcNum;p++){
     NextProc = ProcRank+1;
  if ( ProcRank ==ProcNum-1 ) 
      NextProc = 0;
  PrevProc = ProcRank-1;
  if ( ProcRank == 0 )
      PrevProc = ProcNum-1;
  MPI_Sendrecv_replace(bufB,part, MPI_DOUBLE, NextProc, 0, PrevProc, 0, MPI_COMM_WORLD, &Status);//Сдвиг вдоль процессов
  temp=0.0;
  for (i=0; i<ProcPartSize;i++){
      for(j=0;j<ProcPartSize; j++){
          for(k=0;k<dim;k++){
              temp +=bufA[i*dim+k]*bufB[j*dim+k];}
  if (ProcRank-p >=0 ) 
  ind=ProcRank-p;
  else ind=(ProcNum-p+ProcRank);
  bufC[i*dim+j+ind*ProcPartSize]=temp;
  temp=0.0;
  }
  }
 }
 MPI_Gather(bufC, ProcPartElem, MPI_DOUBLE, C, ProcPartElem, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 
 delete []bufA;
 delete []bufB;
 delete []bufC;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2012, 16:10
Ответы с готовыми решениями:

Умножение матриц с использованием классов
Написал простенькую программу для умножения 2ух матриц. Все работает, собственно, кроме умножения....

Умножение матриц с использованием OpenMP
Здрасте. Есть следующая задача. Нужно реализировать умножение двух квадратных матриц с...

Умножение матриц с использованием динамических двумерных массивов
Нужно написать программу, которая будет считывать размер матриц и их члены с клавиатуры, умножать и...

Перемножение матриц с использованием MPI
...доброго времени суток, уважаемые форумчане! Возник такой вопрос: по задаче исходную матрицу...

2
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
22.05.2012, 23:21  [ТС] 2
подскажите что-нибудь
0
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
24.05.2012, 10:28  [ТС] 3
up...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2012, 10:28
Помогаю со студенческими работами здесь

Умножение прямоугольных матриц с использованием функции пользователя.
Превратить квадратную матрицу порядка N, вывестиначальную и превращеную матрици. Найти сумму...

Перемножение матриц, умножение матриц на вектор, сложение матриц
Помогите пожалуйста написать программу, которая производит основные действия с матрицами...

Транспонирование, умножение матриц, сложение матриц Реализовать в одной программере
транспонирование, умножение матриц, сложение матриц; B^3-A^T Реализовать в одной программере....

Умножение матриц с интерфейсом и возможность заполнения исходных матриц из файла
Здравствуйте. Я сделал программу, которая умножает матрицы с интерфейсом, только проблема в том что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru