bài 1 #include #include using namespace std; int main() { int n = omp_get_num_procs(); cout << "So CPU : " << n << endl; return 0; } bài 2 1.tuần tưj #include #include #include #include #include using namespace std; int main() { int N, M; cout << "Nhap N: "; cin >> N; cout << "Nhap M: "; cin >> M; vector> A(N, vector(M)); vector x(M), y(N); srand(time(NULL)); for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) A[i][j] = rand() % 10; for (int i = 0; i < M; i++) x[i] = rand() % 10; auto start = chrono::high_resolution_clock::now(); for (int i = 0; i < N; i++) { y[i] = 0; for (int j = 0; j < M; j++) y[i] += A[i][j] * x[j]; } auto end = chrono::high_resolution_clock::now(); chrono::duration elapsed = end - start; cout << "Thoi gian (chrono) = " << elapsed.count() << " s\n"; return 0; } 2. omp #include #include #include #include #include using namespace std; int main() { int N, M; cout << "Nhap N (so hang): "; cin >> N; cout << "Nhap M (so cot): "; cin >> M; vector> A(N, vector(M)); vector x(M); vector y(N); srand(time(NULL)); for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) A[i][j] = rand() % 10; for (int i = 0; i < M; i++) x[i] = rand() % 10; double start = omp_get_wtime(); #pragma omp parallel for for (int i = 0; i < N; i++) { double sum = 0; for (int j = 0; j < M; j++) sum += A[i][j] * x[j]; y[i] = sum; } double end = omp_get_wtime(); cout << "Thoi gian (OpenMP) = " << (end - start) << " s\n"; return 0; } 3. mpi #include #include #include #include #include using namespace std; int main(int argc, char** argv) { MPI_Init(&argc, &argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int N, M; if (rank == 0) { cout << "Nhap N: "; cin >> N; cout << "Nhap M: "; cin >> M; } MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD); int localN = N / size; vector x(M); vector> localA(localN, vector(M)); vector localY(localN); if (rank == 0) { srand(time(NULL)); vector> A(N, vector(M)); for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) A[i][j] = rand() % 10; for (int i = 0; i < M; i++) x[i] = rand() % 10; // gửi A cho các process con for (int p = 1; p < size; p++) for (int i = 0; i < localN; i++) MPI_Send(A[p*localN + i].data(), M, MPI_DOUBLE, p, 0, MPI_COMM_WORLD); // copy phần rank 0 for (int i = 0; i < localN; i++) for (int j = 0; j < M; j++) localA[i][j] = A[i][j]; } else { for (int i = 0; i < localN; i++) MPI_Recv(localA[i].data(), M, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } MPI_Bcast(x.data(), M, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); double start = MPI_Wtime(); for (int i = 0; i < localN; i++) { localY[i] = 0; for (int j = 0; j < M; j++) localY[i] += localA[i][j] * x[j]; } vector y; if (rank == 0) y.resize(N); MPI_Gather(localY.data(), localN, MPI_DOUBLE, y.data(), localN, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); double end = MPI_Wtime(); if (rank == 0) cout << "Thoi gian (MPI) = " << (end - start) << " s\n"; MPI_Finalize(); return 0; } 4. mpi + omp #include #include #include #include #include #include using namespace std; int main(int argc, char** argv) { MPI_Init(&argc, &argv); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); int N, M; if (rank == 0) { cout << "Nhap N: "; cin >> N; cout << "Nhap M: "; cin >> M; } MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&M, 1, MPI_INT, 0, MPI_COMM_WORLD); int localN = N / size; vector x(M); vector> localA(localN, vector(M)); vector localY(localN); if (rank == 0) { srand(time(NULL)); vector> A(N, vector(M)); for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) A[i][j] = rand() % 10; for (int i = 0; i < M; i++) x[i] = rand() % 10; for (int p = 1; p < size; p++) for (int i = 0; i < localN; i++) MPI_Send(A[p*localN + i].data(), M, MPI_DOUBLE, p, 0, MPI_COMM_WORLD); for (int i = 0; i < localN; i++) for (int j = 0; j < M; j++) localA[i][j] = A[i][j]; } else { for (int i = 0; i < localN; i++) MPI_Recv(localA[i].data(), M, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); } MPI_Bcast(x.data(), M, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); double start = MPI_Wtime(); #pragma omp parallel for for (int i = 0; i < localN; i++) { double sum = 0; for (int j = 0; j < M; j++) sum += localA[i][j] * x[j]; localY[i] = sum; } vector y; if (rank == 0) y.resize(N); MPI_Gather(localY.data(), localN, MPI_DOUBLE, y.data(), localN, MPI_DOUBLE, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); double end = MPI_Wtime(); if (rank == 0) cout << "Thoi gian (Hybrid MPI+OpenMP) = " << (end - start) << " s\n"; MPI_Finalize(); return 0; }