Tải bản đầy đủ (.pdf) (12 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.2 MB, 12 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC</b>

<b>BÁO CÁO THỰC HÀNH TÍNH TỐN SONG SONG MI4364</b>

<b> Nhóm 17</b>

Giảng viên hướng dẫn: Thầy Đồn Duy Trung

<i><b>Hà Nội, tháng 11 năm 2022</b></i>

1

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<small>MỤC LỤC</small>

<small>I.</small> <b><small>Bài tập thực hành chung....4</small></b>

<small>1.Thực hiện song song hóa bài tốn nhân ma trận với vector khi sử dụng mơ hình đa vi xử lý với bộ </small>

<small>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</small>

<small>2. Chương trình openMP tính số Fibonacci thứ N...4</small>

<small>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</small>

<small>II.</small> <b><small>Bài tập thực hành nhóm . ...5</small></b>

<small>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ị </small>

<small>th ời gian thực hiện). Trên cả hai hệ điều hành Windows và Linux. ...5</small>

<small>1.1Tí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</small>

<small>1.2Tính tổng và tích các phần tử của mảng một chiều sử dung sections. ...7</small>

<small>1.3Thực hiện chạy và so sánh thời gian giữa tính tốn tuần tự và tính tốn song song trong môi </small>

<small>trư ờng Windows. ...11</small>

<small>1.4Thực hiện chạy và so sánh thời gian giữa tính tốn tuần tự và tính tốn song song trong mơi </small>

<small>trư ờng Linux. ...11</small>

<small>III.</small> <b><small> luận.Kết...12</small></b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>*Phân công thực hiện công việc </b>

x

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>I.Bài tập thực hành chung.</b>

1. Thực hiện song song hóa bài tố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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="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:

<b>II.Bài tập thực hành nhóm.</b>

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.

<i><b>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.</b></i>

#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 typedoubleLiToDouble(LARGE_INTEGER x) {

double result =

((double)x.HighPart) * 4.294967296E9 + (double)(( ).x LowPart);

returnresult;}

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small>// Function that gets the timestamp in secondsdoubleGetTime() {</small>

<small> LARGE_INTEGERlpFrequency lpPerfomanceCount, ; QueryPerformanceFrequency(&lpFrequency); QueryPerformanceCounter(&lpPerfomanceCount); returnLiToDouble(lpPerfomanceCount) / LiToDouble(lpFrequency);}</small>

<small>voidRandom(double*&mang, intsize) { unsignedlongi</small>

<small> mang = newdouble[size]; for (i = 0; i < size i; ++)</small>

<small> mang[i] = rand() / double(1000) - rand() / double(1000);}</small>

<small>voidShow(double*&mang, intsize) { unsignedlongi</small>

<small> for (i = 0; i < size i; ++) cout<<mang[] <<"\t"; </small>

<small> cout<<" "\n;}</small>

<small> unsignedlongi; longdoubleS1 = 1; for (i = 0; i < size i; ++) S1 *= mang[]; returnS1;}</small>

<small>longdoubleCong(double*&mang, intsize) { unsignedlongi</small>

<small> longdoubleS1 = 1; for (i = 0; i < size i; ++) S1 += mang[]; returnS1;}</small>

<small>intmain() { unsignedlongsize; longdoubleTong = 0Tich = 1; double* mang start finish, , ; cout<<"Nhap kich thuoc mang N = "; cin>>size;</small>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

(ifsize > ) {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!";}

<i><b>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.</b></i>

<i><b>*Thuật toán tính tổng tích bằng Sections</b></i>

Input: mảng n phần tửChia 4 section: Từ 0 -> n/4Từ n/4+1 -> n/2Từ n/2 -> 3n/4Từ 3n/4+1 -> nTong= 0;Tich = 1;

B1: Chạy song song các sectionSection 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,tich4B2:

Tong = tong1 + tong2 + tong3 + tong4Tich = tich1 * tich2 * tich3 * tich4

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="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 typedoubleLiToDouble(LARGE_INTEGER x) {

double result =

((double)x.HighPart) * 4.294967296E9 + (double)(( ).x LowPart);

returnresult;}

// Function that gets the timestamp in secondsdoubleGetTime() {

LARGE_INTEGERlpFrequency lpPerfomanceCount, ; QueryPerformanceFrequency(&lpFrequency); QueryPerformanceCounter(&lpPerfomanceCount); returnLiToDouble(lpPerfomanceCount) / LiToDouble(lpFrequency);

}

voidRandom(double*& mang, size) {int unsigned long;

mang = new double[size]; for ( = ; < i0i size i++);

mang[i] = rand() / double(1000) - rand() / double(1000);}

voidShow(double*& mang, size) {int unsigned long;

for ( = ; < i0i size i; ++) cout << mang i[] <<" "\t; cout <<" "\n;

long doubleNhan_Parelell(double*& mang, size) {int unsigned long;

longdouble = , = , = , = ;S11S21S31S41#pragmaomp parallel sections

{

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

#pragmaomp section {

for ( = ; <= i0isize / ; 4i++) *= S1mang[i]; }

#pragmaomp section {

for ( = i size / + ; <= 4 1isize / ; 2i++) *= S2mang[i];

return * * * ;S1 S2 S3 S4}

long doubleCong_Parelell(double*& mang, size) {int unsigned long;

longdouble = , = , = , = ;S10S20S30S40#pragmaomp parallel sections

#pragmaomp section {

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

for ( = i size / + ; <= 4 1isize / ; 2i++) += S2mang[i];

return + + + ;S1 S2 S3 S4}intmain() {

unsigned long size;

longdoubleTong = 0Tich = 1; double* mang start finish, , ;

cout <<"Nhap kich thuoc mang N = "; cin >> size;

(ifsize > ) {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!";}

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<i><b>1.3.Thực hiện chạy và so sánh thời gian giữa tính tốn tuần tự và tính tốn song song trong mơi trường Windows.</b></i>

<i><b>1.4.Thực hiện chạy và so sánh thời gian giữa tính tốn tuần tự và tính tốn song song trong mơi trường Linux.</b></i>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>III.KẾT LUẬN</b>

- Trong các bài toán và mơ hình tốn lớn cần một tốc độ xử lý nhanh và khốilượng tính tốn lớn thì việc chia nhỏ và sử dụng linh hoạt giữa tính tốn tuần tự và tính tốn song song là rất hữu ích.

o Cần phân tích kỹ bài tốn.

o Trong những bài tốn nhỏ việc tính tốn song song để xử lý có thể làm chậm thời gian so với tính tố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 tốn song song TS. Đào Duy Trung

</div>

×