sem1 homework
parent
d82d9189fb
commit
149ce4231c
@ -0,0 +1,13 @@
|
|||||||
|
#include <mpi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int commsize, my_rank;
|
||||||
|
|
||||||
|
MPI_Init(&argc, &argv);
|
||||||
|
|
||||||
|
MPI_Comm_size(MPI_COMM_WORLD, &commsize);
|
||||||
|
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
|
||||||
|
printf ("Communicator size = %d; My rank = %d\n", commsize,my_rank);
|
||||||
|
|
||||||
|
MPI_Finalize();
|
||||||
|
}
|
@ -0,0 +1,46 @@
|
|||||||
|
#include <mpi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int N, k;
|
||||||
|
int my_rank, commsize;
|
||||||
|
double result, buf = 0;
|
||||||
|
|
||||||
|
MPI_Init(&argc,&argv);
|
||||||
|
|
||||||
|
MPI_Comm_size(MPI_COMM_WORLD, &commsize);
|
||||||
|
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
|
||||||
|
|
||||||
|
/* Головной процесс */
|
||||||
|
if (my_rank == 0) {
|
||||||
|
scanf("%d", &N);
|
||||||
|
k = N / commsize;
|
||||||
|
|
||||||
|
for (int i = 1; i < commsize; ++i)
|
||||||
|
MPI_Send(&k, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
|
||||||
|
|
||||||
|
/* Считаем члены суммы, оставшиеся после распределения (в случае commsize < N - считаем всю сумму тут) */
|
||||||
|
for (int i = k * (commsize - 1) + 1; i <= N; i++)
|
||||||
|
result += 1 / (double)i;
|
||||||
|
|
||||||
|
/* Получаем результаты подсчета от всех процессов */
|
||||||
|
printf("[0] result = %f\n", result);
|
||||||
|
for (int i = 1; i < commsize; ++i) {
|
||||||
|
MPI_Recv(&buf, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, NULL);
|
||||||
|
printf("[%d] result = %f\n", i, buf);
|
||||||
|
result += buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("result = %f\n", result);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MPI_Recv(&k, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, NULL);
|
||||||
|
|
||||||
|
for (int i = (my_rank - 1) * k + 1; i < my_rank * k + 1; ++i)
|
||||||
|
result += 1 / (double)i;
|
||||||
|
|
||||||
|
MPI_Send(&result, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Finalize();
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
#include <mpi.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
int commsize, my_rank;
|
||||||
|
int msg = 0;
|
||||||
|
|
||||||
|
MPI_Init(&argc,&argv);
|
||||||
|
MPI_Comm_size(MPI_COMM_WORLD, &commsize);
|
||||||
|
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
|
||||||
|
|
||||||
|
if (my_rank == 0) {
|
||||||
|
printf("[%d] msg = %d\n", my_rank, msg);
|
||||||
|
if (commsize == 1)
|
||||||
|
goto finalize;
|
||||||
|
MPI_Send(&msg, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
|
||||||
|
MPI_Recv(&msg, 1, MPI_INT, commsize - 1, 0, MPI_COMM_WORLD, NULL);
|
||||||
|
printf("[%d] msg = %d\n", my_rank, ++msg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MPI_Recv(&msg, 1, MPI_INT, my_rank - 1, 0, MPI_COMM_WORLD, NULL);
|
||||||
|
printf("[%d] msg = %d\n", my_rank, ++msg);
|
||||||
|
if (my_rank + 1 < commsize)
|
||||||
|
MPI_Send(&msg, 1, MPI_INT, my_rank + 1, 0, MPI_COMM_WORLD);
|
||||||
|
else
|
||||||
|
MPI_Send(&msg, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
finalize:
|
||||||
|
MPI_Finalize();
|
||||||
|
}
|
Loading…
Reference in New Issue