#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, Это сработало, спасибо, друг, я забыл о типизации, теперь, когда я смотрю на это, это имеет смысл