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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Битовые операции. http://www.cyberforum.ru/cpp-beginners/thread581440.html
подскажите пожалуйста как сделать обратное преобразование после выполнения такого кода st=1; st = (st >> 16) & 0x7fff; как теперь получить st =1 st = (st << 16) ????????;
C++ Матрицы: все локальные минимумы заменить на 0, матрицу читать с файла Дана матрица размера M x N. Элемент называется локальным минимумом (максимумом), если она меньше его окружающих элементов. Заменить все локальные минимумы 0. http://www.cyberforum.ru/cpp-beginners/thread581435.html
C++ Составить программу вычисления с применением условного оператора. M=max {a,b,c}
#include <iostream.h> int main() { float x,y,z,A,B; cout<<("Введите x, y, z: "); cin>>x>>y>>z; A=x+y+z; B=x*y*z; float max(float A,float B);
Стек. Использование разделяемой памяти C++
Привет. Как сделать так, чтобы вывелось несколько процессов (pid1, pid2 ,pid3...), в зависимости от значения, введенного через scanf. Например: printf("Vvedite chislo processov\n"); scanf("%d",n); где n - количество процессов. Ввели n=1 один процесс запускается pid1 Если n=2 два процесса pid1, pid2 Листинг кода:
C++ Классы, статические элементы http://www.cyberforum.ru/cpp-beginners/thread581363.html
Помогите разобрать, что делает данный кусок программы. Желательно построчно - на уровне работы компилятора. Спасибо. class A{ int val; static A *all; public: A(int n=0) { val = n; for (int i=0; i<10; i++) if (all==NULL) { all=this; break; } }
C++ Определить число слов Есть программа: Во входном потоке определить количество цифр. # include <stdio.h> int main(void) { int nd=0, c; while ((c=getchar()) !=EOF) if (c >=’0’ && <= ‘9’) nd++; c=getchar(); подробнее

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

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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru