Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<ctime>
- #include<mpi.h>
- #include<cmath>
- using namespace std;
- double Func(double x) {
- return 1 / log(x);
- }
- double Integer(double a, double b, double h) {
- double sum = .0;
- for (double i = a; i < b; i += h) {
- sum += (Func(i) + Func(i + h)) / 2;
- }
- sum *= h;
- //return sum;
- return 2;
- }
- //Нулевой процесс отправляет границы интервалов остальным процессам, использовать рассылку(Scatter);
- //Для получения окончательного результата нулевой процесс получает результаты с помощью парных взаимодействий(send / recv)
- //и суммирует.
- void main(int argc, char** argv)
- {
- const int* y =(const int *)4;
- //MPI_Init(y, &argv);
- MPI_Init(&argc, &argv);
- double a = 2, b = 6;//границы
- int rank;//номер процесса
- int numTasks;//кол-во потоков
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &numTasks);
- MPI_Status status;//статус завершения
- double* sendBuf = new double[3 * numTasks]; //массив с границами интервалов
- double recvBuffer[3];
- double step = (b - a) / numTasks;//шаг в зависимости от ко-ва потоков
- double shift = (b - a) / 10000.;
- clock_t time = clock();
- if (rank == 0) { //границы интервалов вычисляем в нулевом процессе
- for (size_t i = 0; i < numTasks * 3; i += 3) {
- sendBuf[i] = a + i / 3 * step;//начало
- sendBuf[i + 1] = sendBuf[i] + step;//конец
- sendBuf[i + 2] = shift;
- }
- }
- MPI_Scatter(sendBuf, 3, MPI_DOUBLE, recvBuffer, 3, MPI_DOUBLE, 0, MPI_COMM_WORLD);
- // откуда, размер, тип, буфер приема, размер, тип, ранг процесса отправки, коммуникатор
- double res = Integer(recvBuffer[0], recvBuffer[1], recvBuffer[2]);
- double* curRes = new double;
- if (rank == 0)
- {
- time = clock() - time;
- double* curRes = new double();
- MPI_Reduce(&res, curRes, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
- cout << res << endl;
- cout << "Trapes : " << res << endl;
- cout << "Time : " << time << " ms" << endl;
- //delete curRes;
- cout << "CRes : " << *curRes << endl;
- }
- MPI_Finalize(); //
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement