Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <mpi.h>
- double func(double a){
- return double(4)/(1+(a*a)); //afraid of implicit type conv to int
- }
- double trap(double a, double b, double step){
- return 0.5*((func(a) + func(b))*step);
- }
- int main(int argc, char *argv[]){// передаем число N
- int i;
- int N = atoi(argv[argc-1]); //N
- double array[N+1]; //coordinates
- int myrank, size;
- double sum = 0;
- MPI_Status Status;
- MPI_Init(NULL, NULL); //MPI программа начинается отсюда
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
- int divsn = int(ceil(double(N)/size));
- int workr = N/divsn;
- int addworkr = 0; //ноль, если всю работу делают запарные чуваки, иначе 1 доп чувак
- if (N - divsn*workr != 0) addworkr = 1;
- if (myrank >= workr + addworkr) return 0; //неиспользуемый тред
- if (myrank == 0) {
- for (i = 0, i < N+1, i++) {
- array[i] = (i*double(1))/N;
- }
- for (i = 0, i< N, i++) {
- sum+= trap(array[i], array[i+1], double(1)/N);
- }
- printf("one thread sum is %f\n", sum);
- sum = 0;
- for (i = 1, i < workr, i++) {
- MPI_Send(&array[divsn*i], divsn+1, MPI_DOUBLE, i, i, MPI_COMM_WORLD);
- }
- if (addworkr != 0) {// если доп чувак есть, посылаем ему остатки сладки сладкие мулатки
- MPI_Send(&array[workr*divsn], N+1 - workr*divsn, MPI_DOUBLE, workr, workr, MPI_COMM_WORLD);
- }
- for (i = 0, i < divsn, i++) {/// нулевой процесс считает свой кусок (начальный)
- sum += trap(array[i], array[i+1], double(1)/N);
- }
- printf("i'm process %d, and my part is %f\n", myrank, sum);
- double newsum;// сюда будем записывать то, что присылают другие чуваки
- for (i = 1, i<workr+addworkr, i++) {
- MPI_Recv(&newsum, 1, MPI_DOUBLE, i, (workr+addworkr)+i, MPI_COMM_WORLD, &Status); // проверь номер сенда
- sum += newsum;
- }
- printf("i'm process 0, and my par sum is %f\n",sum);
- } else {
- if (myrank < workr) {
- MPI_Recv (&array[0], divsn+1, MPI_DOUBLE, 0,myrank, MPI_COMM_WORLD, &Status);
- for (i = 0, i < divsn, i++) {
- sum += trap(array[i], array[i+1], double(1)/N);
- }
- printf("i'm process %d, and my part is %f\n", myrank, sum);
- }
- if ((addworkr != 0) and (myrank == workr)) {
- MPI_Recv (&array[0], N+1 - workr*divsn, MPI_DOUBLE, 0, workr, MPI_COMM_WORLD, &Status); // с этим чуваком придется работать отдельно
- for (i = 0, i < N - workr*divsn, i++) {
- sum += trap(array[i], array[i+1], double(1)/N);
- }
- printf("i'm process %d, and my part is %f\n", myrank, sum);
- }
- MPI_Send(&sum, 1, MPI_DOUBLE, 0, (workr+addworkr)+myrank, MPI_COMM_WORLD);//посылаем посчитанную сумму нулю
- }
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement