Bài tập thực hành chung....41.Thực hiện song song hóa bài toán nhân ma trận với vector khi sử dụng mô hình đa vi xử lý với bộ nh ớ dung chung.. ...51.Viết chương trình tính tổng và tích
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC
BÁO CÁO THỰC HÀNH TÍNH TOÁN SONG SONG MI4364
Nhóm 17
Giảng viên hướng dẫn: Thầy Đoàn Duy Trung
Hà Nội, tháng 11 năm 2022
1
Trang 2MỤC LỤC
I. Bài tập thực hành chung .4
1 Thực hiện song song hóa bài toán nhân ma trận với vector khi sử dụng mô hình đa vi xử lý với bộ
nh ớ dung chung So sánh kết quả với phương pháp tuần tự và điền vào bảng .4
2 Chương trình openMP tính số Fibonacci thứ N 4
3 Áp dụng bài ma trận nhân véc tơ để thực hiện bài ma trận nhân với ma trận 5
II. Bài tập thực hành nhóm .5
1 Viết chương trình tính tổng và tích các phần tử của mảng một chiều sử dụng sections (Hiển thị
th ời gian thực hiện) Trên cả hai hệ điều hành Windows và Linux 5
1.1 Tính tổng và tích các phần tử của mảng một chiều bằng phương pháp tuần tự 5
1.2 Tính tổng và tích các phần tử của mảng một chiều sử dung sections 7
1.3 Thực hiện chạy và so sánh thời gian giữa tính toán tuần tự và tính toán song song trong môi
trư ờng Windows 11
1.4 Thực hiện chạy và so sánh thời gian giữa tính toán tuần tự và tính toán song song trong môi
trư ờng Linux 11
III. luận Kết 12
Trang 3*Phân công thực hiện công việc
Tên thành viên
Phần công việc đã thực hiện
Ma trận *
Nhóm trưởng: Vũ
Nhật Minh
x
Trang 4I Bài tập thực hành chung.
1 Thực hiện song song hóa bài toán nhân ma trận với vector khi sử dụng
mô hình đa vi xử lý với bộ nhớ dung chung So sánh kết quả với phương pháp tuần tự và điền vào bảng
Bảng kết quả thực nghiệm:
2 Chương trình openMP tính số Fibonacci thứ N
Bảng kết quả thực nghiệm:
Trang 53 Áp dụng bài ma trận nhân véc tơ để thực hiện bài ma trận nhân với
ma trận
Bảng kết quả thực nghiệm:
II Bài tập thực hành nhóm.
Viết chương trình tính tổng và tích các phần tử của mảng một chiều sử dụng Sections (Hiển thị thời gian thực hiện) Trên cả hai hệ điều hành Windows và Linux.
1.1 Tính tổng và tích các phần tử của mảng một chiều bằng phương pháp tuần
tự trên Windows.
#include <iostream>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
// Function that converts numbers form LongInt type to double type
double LiToDouble (LARGE_INTEGER x) {
double result =
(( double )x.HighPart ) * 4.294967296E9 +
( double )(( ) x LowPart );
return result ;
}
Trang 6// Function that gets the timestamp in seconds
double GetTime () {
LARGE_INTEGER lpFrequency lpPerfomanceCount , ; QueryPerformanceFrequency (& lpFrequency ); QueryPerformanceCounter (& lpPerfomanceCount ); return LiToDouble ( lpPerfomanceCount ) /
LiToDouble ( lpFrequency );
}
void Random ( double*& mang , int size ) {
unsigned long i
mang = new double [ size ];
for ( i = 0 ; i < size i ; ++)
mang [ i ] = rand () / double ( 1000 ) - rand () / double ( 1000 ); }
void Show ( double*& mang , int size ) {
unsigned long i
for ( i = 0 ; i < size i ; ++) cout << mang [ ] << " \t " ;
cout << " " \n ;
}
unsigned long i ;
long double S1 = 1 ;
for ( i = 0 ; i < size i ; ++)
S1 *= mang [ ];
return S1 ;
}
long double Cong ( double*& mang , int size ) {
unsigned long i
long double S1 = 1 ;
for ( i = 0 ; i < size i ; ++)
S1 += mang [ ];
return S1 ;
}
int main () {
unsigned long size ;
long double Tong = 0 Tich = 1 ;
double * mang start finish , , ;
cout << "Nhap kich thuoc mang N = " ;
cin >> size ;
Trang 7( if size > ) { 0
Random (mang size); ,
Show (mang size); ,
start = GetTime ();
Tong = Cong ( mang size , );
Tich = Nhan ( mang size , );
finish = GetTime ();
cout << "Tong cua cac phan tu trong mang la " << Tong;
cout << "\nTich cua cac phan tu trong mang la " << Tich;
cout << "\nThoi gian tinh toan tuan tu la " << finish
start ;
}
else cout << "Kich thuoc nhap vao chua dung!" ;
}
1.2 Tính tổng và tích các phần tử của mảng một chiều sử dụng Sections.
*Thuật toán tính tổng tích bằng Sections
Input: mảng n phần tử
Chia 4 section:
Từ 0 -> n/4
Từ n/4+1 -> n/2
Từ n/2 -> 3n/4
Từ 3n/4+1 -> n
Tong= 0;
Tich = 1;
B1: Chạy song song các section
Section 1:
Chạy từ i:=0 -> n/4
Tong1 += a[i];
Tich1 *= a[i];
Chạy tương tự với các section ta đc tong2,tich2,tong3,tich3,tong4,tich4 B2:
Tong = tong1 + tong2 + tong3 + tong4
Tich = tich1 * tich2 * tich3 * tich4
Trang 8#include <iostream>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <omp.h>
using namespace std;
// Function that converts numbers form LongInt type to double type double LiToDouble (LARGE_INTEGER x) {
double result =
(( double )x.HighPart ) * 4.294967296E9 +
( double )(( ) x LowPart );
return result ;
}
// Function that gets the timestamp in seconds
double GetTime () {
LARGE_INTEGER lpFrequency lpPerfomanceCount , ; QueryPerformanceFrequency (& lpFrequency );
QueryPerformanceCounter (& lpPerfomanceCount );
return LiToDouble (lpPerfomanceCount) /
LiToDouble ( lpFrequency );
}
void Random ( double*& mang, size) { int
unsigned long ;
mang = new double [ size ];
for ( = ; < i 0 i size i++) ;
mang[i ] = rand () / double ( 1000 ) - rand () / double ( 1000 ); }
void Show ( double*& mang, size) { int
unsigned long ;
for ( = ; < i 0 i size i ; ++) cout << mang i [ ] << " " \t ;
cout << " " \n ;
}
long double Nhan_Parelell ( double*& mang, size) { int
unsigned long ;
long double = , = , = , = ; S1 1 S2 1 S3 1 S4 1
#pragma omp parallel sections
{
Trang 9#pragma omp section
{
for ( = ; <= i 0 i size / ; 4 i++)
*= S1 mang[i];
}
#pragma omp section
{
for ( = i size / + ; <= 4 1 i size / ; 2 i++) *= S2 mang[i];
}
#pragma omp section
{
for ( = i size / + ; <= * 2 1 i 3 size / ; 4 i++) *= S3 mang[i];
}
#pragma omp section
{
for ( = * i 3 size / + ; < 4 1 i size i++) ; *= S4 mang[i];
}
}
return * * * ; S1 S2 S3 S4
}
long double Cong_Parelell ( double*& mang, size) { int unsigned long ;
long double = , = , = , = ; S1 0 S2 0 S3 0 S4 0
#pragma omp parallel sections
{
#pragma omp section
{
for ( = ; <= i 0 i size / ; 4 i++)
+= S1 mang[i];
}
#pragma omp section
{
Trang 10for ( = i size / + ; <= 4 1 i size / ; 2 i++)
+= S2 mang[i];
}
#pragma omp section
{
for ( = i size / + ; <= * 2 1 i 3 size / ; 4 i++)
+= S3 mang[i];
}
#pragma omp section
{
for ( = * i 3 size / + ; < 4 1 i size i++) ;
+= S4 mang[i];
}
}
return + + + ; S1 S2 S3 S4
} int main () {
unsigned long size ;
long double Tong = 0 Tich = 1 ;
double * mang start finish , , ;
cout << "Nhap kich thuoc mang N = " ;
cin >> size ;
( if size > ) { 0
Random (mang size); ,
Show (mang size); ,
start = GetTime ();
Tong = Cong_Parelell ( mang size , );
Tich = Nhan_Parelell ( mang size , );
finish = GetTime ();
cout << "Tong cua cac phan tu trong mang la " << Tong; cout << "\nTich cua cac phan tu trong mang la " << Tich; cout << "\nThoi gian tinh toan la " << finish start - ; }
else cout << "Kich thuoc nhap vao chua dung!" ;
}
Trang 111.3 Thực hiện chạy và so sánh thời gian giữa tính toán tuần tự và tính toán song song trong môi trường Windows.
1.4 Thực hiện chạy và so sánh thời gian giữa tính toán tuần tự và tính toán song song trong môi trường Linux.
Trang 12III KẾT LUẬN
- Trong các bài toán và mô hình toán lớn cần một tốc độ xử lý nhanh và khối lượng tính toán lớn thì việc chia nhỏ và sử dụng linh hoạt giữa tính toán tuần tự và tính toán song song là rất hữu ích.
- Lợi ích:
o Tận dụng tối đa được phần cứng có sẵn.
o Giảm thiểu thời gian xử lý.
o Chuyển những bài toán không khả thi thành những bài toán khả thi.
- Nhược điểm:
o Cần phân tích kỹ bài toán.
o Trong những bài toán nhỏ việc tính toán song song để xử lý có thể làm chậm thời gian so với tính toán tuần tự.
o Ngoài ra việc lựa chọn kỹ thuật song song cũng là yếu tố quan trọng
để cải thiện tính khả thi cũng như hiệu suất xử lý.
Tham khảo
- Slide Tính toán song song TS Đào Duy Trung