|
1 | 1 | #include <iostream>
|
2 | 2 | #include <mpi.h>
|
3 |
| - |
4 |
| -const int SIZE = 10000; |
| 3 | +#include <string> |
| 4 | +#include <ctime> |
5 | 5 |
|
6 | 6 | using namespace std;
|
7 | 7 |
|
8 | 8 | int main(int argc, char *argv[])
|
9 | 9 | {
|
10 |
| - double myVector[SIZE]; |
11 |
| - int myId, numProcs; |
12 |
| - double startTime = 0; |
13 |
| - double endTime; |
| 10 | + srand(time(0)); |
14 | 11 |
|
15 |
| - for (int i = 0; i < SIZE; i++) { |
16 |
| - myVector[i] = 1; |
17 |
| - } |
| 12 | + double* myVector; |
| 13 | + int size; |
| 14 | + |
| 15 | + string sizeStr; |
| 16 | + sizeStr = argv[1]; |
| 17 | + size = atoi(sizeStr.c_str()); |
18 | 18 |
|
19 |
| - int flag; // Ôëàã èíöèàëèçàöèè |
20 |
| - MPI_Status status; |
| 19 | + myVector = new double[size]; |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | + // for parallel block |
| 25 | + double myResult = 0; |
| 26 | + double startTime = 0; |
| 27 | + double endTime; |
| 28 | + double myTime = 0; |
21 | 29 | double mySum = 0;
|
22 |
| - double myResult = 0; |
| 30 | + int remainderDiv = 0; |
| 31 | + int flag; |
| 32 | + int myId, numProcs; |
23 | 33 |
|
24 |
| - MPI_Init(&argc, &argv); // Èíöèàëèçèðóåì MPI-îêðóæåíèå |
25 |
| - MPI_Initialized(&flag); // Ïðîâåðêà |
| 34 | + // for line block |
| 35 | + double myResult_ = 0; |
| 36 | + double startTime_ = 0; |
| 37 | + double endTime_ = 0; |
| 38 | + double myTime_ = 0; |
| 39 | + |
| 40 | + // Initialize the MPI environment |
| 41 | + |
| 42 | + MPI_Init(&argc, &argv); |
| 43 | + MPI_Initialized(&flag); // check |
26 | 44 | if (!flag) {
|
27 | 45 | std::cout << "Error: MPI_Init";
|
28 | 46 | }
|
29 | 47 |
|
30 |
| - // Îïèñàíèå êîììóíèêàòîðà |
31 |
| - // Êîììóíèêàòîð óïðàâëÿåò ãðóïïàìè ïàðàëëåëüíûõ ïðîöåcñîâ |
32 |
| - MPI_Comm_size(MPI_COMM_WORLD, &numProcs); // Îïðåäåëåíèå êîëè÷åñòâî ïðîöåññîâ â ãðóïïå |
33 |
| - MPI_Comm_rank(MPI_COMM_WORLD, &myId); // Îïðåäåëåíèå ðàíãà ïðîöåññà â ãðóïïå |
| 48 | + |
| 49 | + // Description of the communicator |
| 50 | + // communicator manages groups of parallel processes |
| 51 | + MPI_Comm_size(MPI_COMM_WORLD, &numProcs); // determining the number of processes in a group |
| 52 | + MPI_Comm_rank(MPI_COMM_WORLD, &myId); // determining the rank of a process in a group |
34 | 53 |
|
35 | 54 |
|
36 | 55 | if (myId == 0) {
|
37 |
| - startTime = MPI_Wtime(); |
| 56 | + |
| 57 | + for (int i = 0; i < size; i++) { |
| 58 | + myVector[i] = (double)(rand()%5) / ((double)(rand()%10) + 1); |
| 59 | + } |
| 60 | + //*LINE BLOCK* |
| 61 | + startTime_ = MPI_Wtime(); |
| 62 | + for (int i = 0; i < size; i++) { |
| 63 | + myResult_ += myVector[i]; |
| 64 | + } |
| 65 | + endTime_ = MPI_Wtime(); |
| 66 | + cout << endl << "*LINE*" << endl; |
| 67 | + cout << "Result: " << myResult_ << endl; |
| 68 | + myTime_ = endTime_ - startTime_; |
| 69 | + cout << "Time: " << myTime_ << " sec" << endl; |
| 70 | + //*END |
| 71 | + |
| 72 | + //*PARALLEL BLOCK* |
| 73 | + startTime = MPI_Wtime(); // started counting time in 0 proccess |
| 74 | + |
38 | 75 | }
|
39 | 76 |
|
40 |
| - MPI_Bcast(&myVector[SIZE / numProcs * myId], SIZE / numProcs, MPI_DOUBLE, 0, MPI_COMM_WORLD); |
41 |
| - |
42 |
| - for (int i = SIZE / numProcs * myId; i < SIZE / numProcs + SIZE / numProcs * myId; i++) { |
| 77 | + MPI_Bcast(myVector, size , MPI_DOUBLE, 0, MPI_COMM_WORLD); |
| 78 | + |
| 79 | + for (int i = size / numProcs * myId; i < size / numProcs + size / numProcs * myId; i++) { |
43 | 80 | mySum += myVector[i];
|
44 | 81 | }
|
45 | 82 |
|
46 | 83 | MPI_Reduce(&mySum, &myResult, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
|
47 | 84 |
|
48 |
| - |
| 85 | + |
49 | 86 | if (myId == 0) {
|
50 |
| - cout << "Result: " << myResult << endl; |
| 87 | + remainderDiv = size % numProcs; |
| 88 | + if (remainderDiv) { |
| 89 | + for (int i = 0; i < remainderDiv; i++) |
| 90 | + myResult += myVector[size - remainderDiv + i]; |
| 91 | + } |
| 92 | + |
| 93 | + //Parallel Results |
51 | 94 | endTime = MPI_Wtime();
|
52 |
| - cout << "Time: " << (endTime - startTime) << " sec" << endl; |
53 |
| - //system("pause"); |
| 95 | + cout << endl <<"*PARALLEL*" << endl; |
| 96 | + cout << "Result: " << myResult << endl; |
| 97 | + myTime = endTime - startTime; |
| 98 | + cout << "Time: " << myTime << " sec" << endl << endl; |
54 | 99 | }
|
55 |
| - |
| 100 | + |
56 | 101 |
|
57 | 102 | MPI_Finalize();
|
| 103 | + //*END PARALLEL BLOCK* |
| 104 | + |
| 105 | + delete[]myVector; |
58 | 106 |
|
| 107 | + return 0; |
59 | 108 | }
|
0 commit comments