Среднее значение вектора в C с использованием mpi

#c #mpi

Вопрос:

Здравствуйте, друзья, в настоящее время я работаю над проектом C для своего университетского класса. То, что я пытаюсь сделать, — это найти среднее значение вектора, однако мне нужно сделать это с помощью mpi. Я написал некоторый код, но по какой-то причине среднее значение, которое я получаю, равно нулю

рассмотрим следующий код:

 #include lt;stdio.hgt; #include "mpi.h"  int main(int argc, char** argv) {  int my_rank;  int plithos_dierg, k, res, finres, num;  int source, target;  int tag1 = 50, tag2 = 60, tag3 = 70;  int plithos;  float data[100], mesi_timh = 0, m, f1;  float data_loc[100];  MPI_Status status;   MPI_Init(amp;argc, amp;argv);  MPI_Comm_rank(MPI_COMM_WORLD, amp;my_rank);  MPI_Comm_size(MPI_COMM_WORLD, amp;plithos_dierg);   if (my_rank == 0) {   printf("Dwse to PLITHOS twn stoixeiwn tou dianhsmatos n");  scanf("%d", amp;plithos);  printf("Dwse ta stoixeia tou dianhsmatos n");   for (int i = 0; i lt; plithos; i  ) {  printf("Dwse to %d noumero n", i);  scanf("%f", amp;data[i]);  //mesi_timh=mesi_timh   data[i];  }  for (target = 1; target lt; plithos_dierg; target  ) {  MPI_Send(amp;plithos, 1, MPI_INT, target, tag1, MPI_COMM_WORLD);   num = plithos / plithos_dierg; //posous arithmous h kathe diergasia.  k = num;  }   for (target = 1; target lt; plithos_dierg; target  ) {  MPI_Send(amp;data[k], num, MPI_FLOAT, target, tag2, MPI_COMM_WORLD);  k  = num;  }  for (k = 0; k lt; num; k  )  data_loc[k] = data[k];  }  else {  MPI_Recv(amp;plithos, 1, MPI_INT, 0, tag1, MPI_COMM_WORLD, amp;status);  num = plithos / plithos_dierg;  MPI_Recv(amp;data_loc[0], num, MPI_INT, 0, tag2, MPI_COMM_WORLD, amp;status);  }  res = 0;  for (k = 0; k lt; num; k  ) {  res = res   (data_loc[k]);  printf(" mesa sto for %d n", res);  }  // f1=res/plithos;  //printf("mesi timi m %f",f1);   if (my_rank != 0) {  printf("prin to mpi send %d n", res);  MPI_Send(amp;res, 1, MPI_INT, 0, tag3, MPI_COMM_WORLD);  }  else {   printf("n Apotelesma of process %d: %dn", my_rank, res);  finres = res;  for (source = 1; source lt; plithos_dierg; source  ) {  MPI_Recv(amp;res, 1, MPI_INT, source, tag3, MPI_COMM_WORLD, amp;status);   printf("n Apotelesma of process %d: %dn", source, res);  finres = finres   res;  }  /*  printf("n DIANHSMA:[ ");  for(int i=0;ilt;plithos;i  ) {  printf("%f",data[i]);  printf(", ");  }  printf("] ");*/  printf("to plithos einai %d n", plithos);  printf("to final result einai %f n", finres);  printf("nnn H MESH TIMH TOY DIANHSMATOS EINAI: %fn", finres / plithos);  }  printf("nnn H MESH TIMH TOY DIANHSMATOS EINAI: %fn", finres / plithos);  MPI_Finalize();  // printf("nnn H MESH TIMH TOY DIANHSMATOS EINAI: %fn", finres/plithos); }  

В какой-то момент я заметил, что когда я пытаюсь напечатать вектор вместо нуля, я получаю последнее число вектора в качестве конечного результата. Я новичок в программировании mpi, поэтому, пожалуйста, простите мои ошибки

заранее спасибо!

Комментарии:

1. printf("nnn H MESH TIMH TOY DIANHSMATOS EINAI: %fn", finres / plithos); ==gt; printf("nnn H MESH TIMH TOY DIANHSMATOS EINAI: %fn", (double)finres / plithos); . int / int приводит к int .

2. Это отличная возможность изучить несколько коллективов: MPI_Bcast() , MPI_Scatterv() и MPI_Reduce()

3. @mch, Это сработало, спасибо, друг, я забыл о типизации, теперь, когда я смотрю на это, это имеет смысл