ChienI Kao
筆記網站
JHTNT
筆記網站
# 題目
利用 The Sieve of Eratosthenes 演算法找出質數
# 單機版程式
| #include <bits/stdc++.h> | |
| #define ALLNUM 100000000 | |
| using namespace std; | |
| long long arr[ALLNUM + 1] = {0}; | |
| int main() { | |
| int k = 2; | |
| long start = clock(); | |
| for (int i = 2; i <= ALLNUM;) { | |
| k = i; | |
| if (k * k > ALLNUM) { | |
| break; | |
|     } | |
| int mark = k + k; | |
| while (mark <= ALLNUM) { | |
| arr[mark] = 1; | |
| mark += k; | |
|     } | |
| i++; | |
| while (arr[i] != 0) { | |
| i++; | |
|     } | |
|   } | |
| long end = clock(); | |
| int ans = 0; | |
| for (int i = 2; i <= ALLNUM; i++) { | |
| if (arr[i] == 0) { | |
| ans++; | |
|     } | |
|   } | |
| printf("%d\n", ans); | |
| cout << "\033[36mTotal: " << (end - start) / 1000.0 << " (sec)\033[0m" | |
| << endl; | |
| return 0; | |
| } | 
# 平行版程式
| #include <bits/stdc++.h> | |
| #include <mpi.h> | |
| #define ALLNUM 100000000 | |
| using namespace std; | |
| long long arr[ALLNUM + 1] = {0}; | |
| long long ans = 0; | |
| int main() { | |
| MPI_Init(NULL, NULL); | |
| int world_size, world_rank; | |
| MPI_Comm_size(MPI_COMM_WORLD, &world_size); | |
| MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); | |
| int size = ALLNUM / world_size; | |
| int from = world_rank * size; | |
| int to = | |
| (world_rank != world_size - 1 ? (world_rank + 1) * size - 1 : ALLNUM); | |
| int k = 2; | |
| arr[0] = 1; | |
| arr[1] = 1; | |
| double start = MPI_Wtime(); | |
| for (int i = from; i <= to;) { | |
| MPI_Bcast(&k, 1, MPI_INT, 0, MPI_COMM_WORLD); | |
| if (k * k > ALLNUM) { | |
| break; | |
|     } | |
| if (k < to) { | |
| int mark = from; | |
| while (mark % k != 0 || mark == 0) { | |
| mark += 1; | |
|       } | |
| if (mark == k) { | |
| mark += k; | |
|       } | |
| while (mark <= to) { | |
| arr[mark] = 1; | |
| mark += k; | |
| } // marking | |
| i++; | |
| while (arr[i] != 0) { | |
| i++; | |
| } // find K | |
|     } | |
| int newK = i; | |
| MPI_Reduce(&newK, &k, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); | |
|   } | |
| int count = 0; | |
| for (int i = from; i <= to; i++) { | |
| if (arr[i] == 0 && i != 0 && i != 1) { | |
| count++; | |
|     } | |
|   } | |
| MPI_Reduce(&count, &ans, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); | |
| double end = MPI_Wtime(); | |
| MPI_Finalize(); | |
| if (world_rank == 0) { | |
| cout << ans << endl; | |
| cout << "\033[36mTotal: " << (end - start) << " (sec)\033[0m" << endl; | |
|   } | |
| return 0; | |
| } | 

