1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo thực hành tính toán song song mi4364

12 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo cáo thực hành tính toán song song MI4364
Tác giả Lê Viết Đăng, Dương Tiến Đạt, Vũ Nhật Minh, Hoàng Văn Toàn, Nguyễn Văn Trung
Người hướng dẫn Thầy Đoàn Duy Trung
Trường học Đại Học Bách Khoa Hà Nội, Viện Toán Ứng Dụng Và Tin Học
Chuyên ngành Tính toán song song
Thể loại Báo cáo thực hành
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 12
Dung lượng 1,2 MB

Nội dung

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 2

MỤ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 4

I 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 5

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

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 10

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

} 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 11

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.

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 12

III 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

Ngày đăng: 13/06/2024, 16:52

w