Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
guf
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
21.05.2012, 16:10     Ленточное умножение матриц с использованием MPI #1
Помогите разобраться, почему в результирующей матрице С диагональные элементы считаются неправильно? Код взят отсюда.

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2012, 16:10     Ленточное умножение матриц с использованием MPI
Посмотрите здесь:

C++ Умножение матриц
C++ Умножение матриц
C++ Умножение матриц
Умножение матриц C++
Умножение матриц с использованием OpenMP C++
C++ Умножение треугольных матриц«Методы обработки разреженных матриц»
C++ Японский кроссворд с использованием MPI
C++ Умножение матриц

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
guf
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
22.05.2012, 23:21  [ТС]     Ленточное умножение матриц с использованием MPI #2
подскажите что-нибудь
guf
0 / 0 / 0
Регистрация: 10.12.2009
Сообщений: 7
24.05.2012, 10:28  [ТС]     Ленточное умножение матриц с использованием MPI #3
up...
Yandex
Объявления
24.05.2012, 10:28     Ленточное умножение матриц с использованием MPI
Ответ Создать тему
Опции темы

Текущее время: 11:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru