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

Lập trình song song bài toán nhân ma trận

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.09 MB, 19 trang )

Page 0


T
T
R
R
Ư
Ư


N
N
G
G


Đ
Đ


I
I


H
H


C
C




B
B
Á
Á
C
C
H
H


K
K
H
H
O
O
A
A


H
H
À
À


N
N



I
I


V
V
I
I


N
N


Đ
Đ
I
I


N
N


T
T





-
-


V
V
I
I


N
N


T
T
H
H
Ô
Ô
N
N
G
G



















BÁO CÁO MÔN LẬP TRÌNH SONG SONG

Đề tài: ỨNG DỤNG LẬP TRÌNH SONG SONG VÀO GIẢI
QUYẾT BÀI TOÁN NHÂN MA TRẬN



Giảng viên giảng dạy : TS. PHẠM DOÃN TĨNH
Học viên thực hiện :
1. PHẠM HOÀNG ANH – CB130528
2. NGUYỄN ĐĂNG HIẾU – CB130529
3. NGUYỄN VĂN LONG – CB130530
Lớp : 13BKTĐT.KH






Hà Nội, 02/2014

Page 1


MỤC LỤC
DANH MỤC BẢNG BIỂU 2
DANH MỤC HÌNH VẼ 2
LỜI NÓI ĐẦU 3
CHƯƠNG 1: TỔNG QUAN VỀ MÔ HÌNH LẬP TRÌNH SONG SONG VỚI OPEN MP
4
1. TÍNH TOÁN SONG
SONG
4
1.1. Tính toán song song là
gì?
4
1.2. Tại sao phải tính toán song
song?
4
2.

GIỚI THIỆU VỀ OPENMP
4
2.1.

Khái niệm về OpenMP
4

2.2.

Mô hình lập trình song song OpenMP
5
2.2.1. Song song hóa dựa trên cơ chế luồng (Thread based parallelism) 5
2.2.2. Mô hình song song hiện (Explicit Parallelism) 5
2.2.3. Mô hình Fork-Join 5
2.3.

Chỉ thị trong OpenMP
6
2.3.1. Khuôn dạng chỉ thị 6
2.3.2. Phạm vi của chỉ thị: 6
2.3.3. Cấu trúc chia sẻ 7
2.3.3.1. Chỉ thị Do/For 7
2.3.3.2. Chỉ thị Sections 7
2.3.3.3. Chỉ thị Single 7
2.3.4. Cấu trúc đồng bộ dữ liệu 8
2.3.4.1. Chỉ thị master 8
2.3.4.2. Chỉ thị critical 8
2.3.4.3. Chỉ thị Barrier 8
2.3.4.4. Chỉ thị Atomic 8
2.4.

Các mệnh đề trong OpenMP
8
2.5.

Thư viện và các biến môi trường
9

2.5.1. Thư viện Runtime 9
2.5.2. Biến môi trường 9
CHƯƠNG 2: ỨNG DỤNG LẬP TRÌNH SONG SONG VÀO GIẢI QUYẾT BÀI TOÁN
NHÂN MA TRẬN 10
1. BÀI TOÁN NHÂN HAI MA TRẬN 10
2. KẾT QUẢ THỰC HIỆN 10
KẾT LUẬN 14
TÀI LIỆU THAM KHẢO 14
PHỤ LỤC 1: SOURCE CODE NHÂN HAI MA TRẬN KHÔNG SỬ DỤNG OPENMP
15
PHỤ LỤC 2: SOURCE CODE NHÂN HAI MA TRẬN SỬ DỤNG OPENMP 16
Page 2










DANH MỤC BẢNG BIỂU
Bảng 1: Thời gian tính toán nhân hai ma trận không sử dụng OpenMP 10
Bảng 2: Thời gian tính toán nhân hai ma trận sử dụng OpenMP 11
Bảng 3: Tính toán Speed up và Efficiency dựa trên thời gian chạy trung bình 11
Bảng 4: Tính toán Speed up và Efficiency dựa trên thời gian chạy lâu nhất 11

DANH MỤC HÌNH VẼ
Hình 1: Kiến trúc OpenMP 5

Hình 2: Mô hình Fork-Join 6
Hình 3:Biểu đồ so sánh thời gian tính toán trung bình 12
Hình 4:Biểu đồ so sánh thời gian tính toán lâu nhất 12
Hình 5:Biểu đồ Speed Up 13
Hình 6:Biểu đồ Efficiency 13



















Page 3

LỜI NÓI ĐẦU
Ngày nay sự phát triển của công nghệ được thách thức bởi lớp bài toán lớn
cần
giải quyết trong nhiều lĩnh vực của đời sống xã hội như dự báo thời tiết, khai phá

dữ
liệu, xử lý ảnh, mô phỏng tai nạn xe hơi, tự động hóa Lớp bài toán này vừa
đòi
hỏi
đáp ứng thời gian thực vừa yêu cầu xử lý trên khối dữ liệu lớn. Để giải
quyết bài
toán
này đòi hỏi các bộ xử lý có hiệu năng
cao.

Xử lý song song ra đời với mục đích làm tăng khả năng tính toán của máy
tính
bằng cách kết hợp nhiều bộ xử lý tham gia đồng thời vào quá trình xử lý thay với
việc
sử dụng các máy tính chuyên biệt đắt
tiền.

Với sự phát triển của kiến trúc máy tính và mạng máy tính cho thấy rằng
trong
tương lai xử lý song song không những được thực hiện trên những siêu
máy
tính
mà có thể được thực hiện trên các trạm làm việc, máy tính cá nhân, mạng
máy
tính. Nhưng hầu hết các thuật toán ngày nay đều là những thuật toán tuần tự. Cho
nên
cần xây dựng những thuật toán, cấu trúc dữ liệu cho phép xử lý một cách song
song.

Trong khuôn khổ của bài tập này và yêu cầu của môn học, chúng em lựa

chọn bài toán nhân hai ma trận có số lượng phần tử lớn được lập trình tuần tự và
song song để đánh giá tốc độ xử lý và hiệu năng sử dụng. Thông qua đó, chúng em có
thể hiểu nhiều hơn nữa về môn học lập trình song song này.
Nội dung của bài báo cáo này gồm các phần:
Chương 1: Tổng quan về mô hình lập trình song song với Open MP
Chương 2: Ứng dụng lập trình song song vào bài toán nhân hai ma trận
Chúng em xin được gửi lời cảm ơn chân thành đến giảng viên TS. Phạm
Doãn Tĩnh đã tận tình giảng dạy và giúp đỡ chúng em trong thời gian học tập học
phần này.








Page 4

Chương 1: Tổng quan về mô hình lập trình song song với Open MP
1. Tính toán song
song

1.1. Tính toán song song là
gì?

Như chúng ta đã thấy các phần mềm phổ biến ngày nay hầu hết đều được
viết
trên cơ sở của tính toán tuần tự. Các phần mềm này thường được thực hiện trên
một

máy tính đơn với duy nhất một bộ xử lý. Vấn đề ở đây được giải quyết thông qua
một
chuỗi các lệnh tuần tự được thực hiện bởi một bộ xử lý. Tại một thời điểm chỉ có
một
lệnh được thực
hiện.

Tính toán song song ra đời là một sự cải tiến của tính toán tuần tự. Nó là
sự
giải quyết vấn đề dựa trên sự thực thi đồng thời của nhiều tài nguyên máy tính .
Tài
nguyên máy tính đây bao
gồm:

♣ Một máy tính đơn với nhiều bộ xử


♣ Nhiều máy tính nối lại với nhau thành một mạng máy
tính

♣ Kết hợp cả hai loại
trên

Tính toán song song thường được dùng để giải quyết các vấn đề hết sức
phức
tạp yêu cầu thời gian tính toán lớn hoặc làm việc với khối dữ liệu lớn như các bài
toán
dự báo thời tiết, mô phỏng tai nạn xe hơi, xây dựng các mô hình thương mại

các

vấn đề khoa học như khai phá dữ liệu , trí tuệ nhân tạo, an toàn dữ
liệu…

1.2. Tại sao phải tính toán song
song?

Việc tính toán song song là rất cần thiết. Ngoài hai nguyên nhân chính là

được dùng để tính toán các bài toán yêu cầu thời gian tính toán lớn và khối lượng
dữ
liệu lớn còn có các nguyên nhân khác như để sử dụng tài nguyên của các máy
khác
trong một mạng LAN hoặc thông qua mạng internet, có thể sử dụng nhiều tài
nguyên
tính toán nhỏ kết hợp lại tạo nên một siêu máy tính. Do giới hạn về không
gian lưu
trữ
của bộ nhớ trên một máy đơn để giải quyết một vấn đề lớn việc sử dụng
nhiều bộ
nhớ
trên nhiều máy tính là rất hữu hiệu trong trường hợp
này.
Giới hạn của tính toán tuần tự bao gồm cả hai nguyên nhân thực tế và
nguyên
nhân vật lý. Để xây dựng nên một máy tính tuần tự tốc độ cao gặp rất nhiều hạn
chế

♣ Về tốc độ truyền dữ liệu: Tốc độ truyền của máy tính tuần tự phụ thuộc
trực
tiếp vào sự di chuyển dữ liệu trong phần cứng. Cho nên việc tăng tốc độ thực

hiện
phải
chủ yếu căn cứ vào các yếu tố tính
toán.

♣ Về kích cỡ: Công nghệ chế tạo bộ xử lý cho phép gắn nhiều bóng bán
dẫn
trên một con chip. Tuy nhiên việc làm này sẽ làm tăng kích thước của bộ xử


♣ Về thương mại: Việc tạo ra một bộ xử lý tốc độ xử lý cao là rất tốn kém.
Sử
dụng nhiều bộ xử lý nhỏ đạt hiệu quả tương tự mà lại ít tốn kém
hơn.
2.

Giới thiệu về OpenMP
2.1.

Khái niệm về OpenMP
Theo Wikipedia:
OpenMP (Open Multi-Processing) là một giao diện lập trình ứng dụng API
(Application programming interface) hỗ trợ đa nền tảng dựa trên cấu trúc chia sẻ bộ
Page 5

nhớ chung, đa ngôn ngữ lập trình C, C++, Fortran và hầu hết các bộ kiến trúc vi xử
lý và hệ điều hành Linux, Unix, Mac OS X, nền tảng Microsoft Windows.
Nó bao gồm :



Các chỉ thị biên dịch (Compiler directives)


Các thư viện Runtime (Library rountines)


Các biến môi trường (Environment variables)

Hình 1: Kiến trúc OpenMP

2.2.

Mô hình lập trình song song OpenMP
2.2.1.

Song song hóa dựa trên cơ chế luồng (Thread based parallelism)
Trong mô hình trên chương trình xử lý trên bộ nhớ toàn cục bao gồm nhiều
luồng thực thi đồng thời. OpenMP dựa vào sự tồn tại của nhiều luồng trên một mô
hình lập trình chia sẻ bộ nhớ chung.
2.2.2.

Mô hình song song hiện (Explicit Parallelism)
Mô hình trên là một mô hình lập trình không tự động. Người lập trình có quyền
điều khiển việc song song hóa một cách độc lập
2.2.3.

Mô hình Fork-Join
Trong các mô hình trên thì OpenMP sử dụng mô hình Fork-Join để thực thi công
việc song song
Page 6



Hình 2: Mô hình Fork-Join

Trong mô hình này tất cả các chương trình song song đều bắt đầu với việc
xử

đơn bởi một luồng chủ (master thread). Luồng chủ này sẽ thực thi một cách tuần
tự
cho tới khi bắt gặp vùng song song (parallel region) đầu tiên
.
FORK: Có nghĩa là luồng chủ sau đó sẽ tạo ra một tập các luồng song
song.
Và sau đó đoạn mã trong vùng song song được thực thi song song bởi tập luồng
song
song vừa tạo
ra
JOIN: Khi mà tập luồng song song đã hoàn thành đoạn mã trong vùng
song
song chúng sẽ được đồng bộ và kết thúc rồi sau đó công việc lại được thực hiện
bởi
luồng
chủ
2.3.

Chỉ thị trong OpenMP
2.3.1.

Khuôn dạng chỉ thị
Chỉ thị trong OpenMP được cho dưới dạng sau:

# pragma omp directive-name [clause ] newline
 # pragma omp: Yêu cầu bắt buộc đối với mọi chỉ thị OpenMP C/C++
 directive-name: Là tên của chỉ thị phải xuất hiện sau #pragma omp và
đứng trước bất kì mệnh đề nào
 [clause ]: Các mệnh đề này không bắt buộc trong chỉ thị
 newline : Yêu cầu bắt buộc với mỗi chỉ thị nó là tập mã lệnh nằm trong
khối cấu trúc được bao bọc bởi chỉ thị
2.3.2.

Phạm vi của chỉ thị:
 Phạm vi tĩnh ( Static Extent ): Đó là những đoạn mã nguyên bản trong
phạm vi từ đầu đến cuối khối cấu trúc cho sau mỗi chỉ thị. Phạm vi tĩnh của chỉ thị
không mở rộng đến các thủ tục và các tệp chứa mã.
 Chỉ thị đơn độc (Orphaned Directive): Chỉ thị đơn độc là chỉ thị xuất
hiện độc lập với chỉ thị khác. Nó tồn tại ở ngoài phạm vi tĩnh của chỉ thị khác. Chỉ
thị đơn độc mở rộng với các thử tục và các tệp mã nguồn
 Phạm vi động (Dynamic Extent): Phạm vi động của chỉ thị bao gồm
phạm vi tĩnh của của chỉ thị và phạm vi của các chỉ thị mồ côi
OpenMP có rất nhiều chỉ thị như: atomic, barrier, critical, flush, for, master,
ordered, parallel, section, single, thread,private.
Page 7

Các cấu trúc thường gặp :
 Cấu trúc chia sẻ
 Cấu trúc đồng bộ
2.3.3.

Cấu trúc chia sẻ
Cấu trúc chia sẻ công việc dùng để chia việc thực hiện công việc trong
vùng

song
song cho các luồng trong tập các luồng thực hiện công việc cho bởi vùng
song
song. Cấu trúc chia sẻ công việc phải được bao bọc bởi một vùng song song để có
thể
thực hiện song song và cấu trúc này có thể được thực hiện bởi tất cả các luồng
trong
tập các luồng hoặc chỉ một số luồng trong tập các luồng thực thi vùng song
song.

ba loại cấu trúc chia sẻ công việc đó là cấu trúc DO/for, cấu trúc
SECTIONS và
cấu
trúc
SINGLE
2.3.3.1.

Chỉ thị Do/For
Chỉ thị DO/for chỉ ra rằng các công việc lặp đi lặp lại (interations) cho
bởi
vòng lặp phải được các luồng thực hiện một cách song song. Chỉ thị for trong
C/C++
được cho dưới dạng
sau:

#pragma omp for [clause ]
newline
schedule ( type [,chunk_size]
)
ordered


private ( list
)
firstprivate ( list
)
lastprivate ( list
)
shared ( list
)

reduction ( operator : list
)

nowait

2.3.3.2.

Chỉ thị Sections
Chỉ thị này dùng để chỉ ra các phần mã trong vùng song song chia cho
các
luồng thực hiện. Trong phạm vi của chỉ thị SECTIONS có các chỉ thị SECTION.
Mỗi
một SECTION sẽ được thực hiện bởi một luồng trong tập các luồng và các
SECTION
khác nhau sẽ được thực hiện bởi các luồng khác nhau. Trong
C/C++ chi
thị
SECTIONS được cho dưới dạng
sau


#pragma omp sections [clause ]
newline
private(
list
)
firstprivate(
list
)
lastprivate(
list
)
reduction(
operator:list
)
nowait

2.3.3.3.

Chỉ thị Single
Page 8

Mệnh đề SINGLE chỉ ra rằng đoạn mã bao quanh chỉ thị chỉ được thực
hiện
bởi một luồng trong tập các luồng. Trong C/C++ chỉ thị SINGLE được cho dưới
dạng
sau:

#pragma omp single [clause ]
newline
private(

list
)
firstprivate(
list
)
nowait

2.3.4.

Cấu trúc đồng bộ dữ liệu
2.3.4.1.

Chỉ thị master
Trong chỉ thị master đoạn mã bao quanh chỉ thị chỉ được thực hiện bởi luồng
chủ trong tập các luồng.
Trong chỉ thị này không có bất cứ mệnh đề nào và các luồng khác không cần chờ
đến khi luồng chủ thực hiện xong công việc cho bởi chỉ thị master mới được thực
hiện công việc của mình.
2.3.4.2.

Chỉ thị critical
Trong chỉ thị Critical thì vùng mã được cho bởi chỉ thị tại một thời điểm chỉ được
thực hiện tại một luồng.
Nếu một luồng nào đó đang thực hiện công việc cho bởi chỉ thị mà có một
luồng khác cố gắng đòi thực hiện công việc đó thì nó sẽ bị khóa cho đếnkhi luồng kia
thực hiện xong công việc đó.
Có thể tồn tại nhiều chỉ thị critical với các tên khác nhau trong cùng một vùng
song song.
2.3.4.3.


Chỉ thị Barrier
Chỉ thị này dùng để đồng bộ tất cả các luông trong tập các luồng . khi bắt gặp chỉ
thị Barrier thì mỗi luồng sẽ chờ tại thời điểm đó(thời điểm bắt gặp chỉ thị Barrier)
cho đến khi tất cả các luồng còn lại bắt gặp chỉ thị Barrier. Sau đó các luồng sẽ cùng
thực thi chỉ thị barrier.
2.3.4.4.

Chỉ thị Atomic
Trong chỉ thị Atomic các địa chỉ vùng nhớ được cập nhập một cách nguyên tố
hơn là việc dùng nhiều luồng cố gắng ghi lên nó.
2.4.

Các mệnh đề trong OpenMP
Vì OpenMP lập trình trên máy tính chia sẻ bộ nhớ chung nên việc hiểu và sử dụng
được phạm vi của các biến trong chương trình là rất quan trọng. Phạm vi của các biến
ở đây bao gồm hai phạm vi toàn cục và phạm vi bảo vệ. Các biến toàn cục bao gồm
các biến tĩnh và biến file toàn cục còn các biến bảo vệ bao gồm biến chỉ số trong vòng
lặp, biến trong thủ tục được gọi từ vùng song song. Các mệnh đề về phạm vi dữ liệu
bao gồm các mệnh đề sau
 PRIVATE
 FIRSTPRIVATE
Page 9

 LASTPRIVATE
 SHARED
 DEFAULT
 REDUCTION
 COPYIN
2.5.


Thư viện và các biến môi trường
2.5.1.

Thư viện Runtime
OpenMP cung cấp một thư viện với rất nhiều các hàm chức năng bao gồm các
truy vấn liên quan đến số lượng và chỉ số các luồng, thiết lập số lượng các luồng sử
dụng, semaphores, và các hàm thiết lập môi trường thực thi. Trong C/C++ để có thể
sử dụng các hàm trên thì phải đính vào file thư viện omp.h.
 OMP_SET_NUM_THREADS
 OMP_GET_NUM_THREADS
 OMP_GET_MAX_THREADS
 OMP_GET_THREAD_NUM
 OMP_GET_NUM_PROCS
 OMP_IN_PARALLEL
 OMP_SET_DYNAMIC
 OMP_GET_DYNAMIC
 OMP_SET_NESTED
 OMP_GET_NESTED
 OMP_INIT_LOCK
 OMP_SET_LOCK
 OMP_UNSET_LOCK
 OMP_TEST_LOCK
2.5.2.

Biến môi trường
Các biến môi trường được dùng để điều khiển sự thực hiện đoạn mã song song.
Bao gồm các biến môi trường sau:
 OMP_SCHEDULE
 OMP_NUM_THREADS
 OMP_DYNAMIC

 OMP_NESTED


Page 10

Chương 2: Ứng dụng lập trình song song vào giải quyết bài toán nhân ma trận
1. Bài toán nhân hai ma trận
Cho hai ma trân A (m*n) và B(n*p):

Tích của hai ma trận C = A*B được thực hiện như sau:

Để so sánh sự khác biệt giữa lập trình tuần tự và lập trình song song, ta tiến
hành nhân hai ma trận có cùng kích thước (N*N, với N lớn). Thông qua thời gian thực
hiện ta thu được kết quả như dưới đây.
2. Kết quả thực hiện
Các tham số sử dụng để đánh giá:
 Hai ma trận vuông, có kích thước như nhau.
 Kích thước ma trận tăng dần từ 500 đến 4000, mỗi lần tăng 500
 Mỗi lần kiểm tra được chạy 3 lần, lấy thời gian trung bình
 Môi trường lập trình: Microsoft Visual Studio 2010
 Chạy kiểm tra trên máy tính Core i5 2.27GHz, 4 core
Bảng 1: Thời gian tính toán nhân hai ma trận không sử dụng OpenMP
TT

Kích thước

ma trận
(NxN)
Thời gian


chạy lần 1

(Giây)
Thời gian

chạyLần 2

(Giây)
Thời gian

chạy lần 3

(Giây)
Thời gian

chạy trung
bình
(Giây)
Thời gian

chạy lâu
nhất
(Giây)
1 500x500 2.226 2.222 1.965 2.138 2.226
2 1000x1000 23.276 22.704 22.679 22.886 23.276
3 1500x1500 73.431 72.957 72.593 72.994 73.431
4 2000x2000 168.976 173.586 149.34 163.967 173.586
5 2500x2500 347.531 352.504 346.597 348.877 352.504
6 3000x3000 650.096 730.219 744.628 708.314 744.628
7 3500x3500 1196.762 1072.1 1079.67 1116.177 1196.762

8 4000x4000 1277.624 1250.586 1260.405 1262.872 1277.624

Page 11


Bảng 2: Thời gian tính toán nhân hai ma trận sử dụng OpenMP
TT

Kích thước

ma trận
(NxN)
Thời gian

chạy lần 1

(Giây)
Thời gian

chạy lần 2

(Giây)
Thời gian

chạy lần 3

(Giây)
Thời gian

chạy trung

bình
(Giây)
Thời gian

chạy lâu
nhất
(Giây)
1 500x500 0.905 0.850 0.819 0.858 0.905
2 1000x1000 7.448 7.364 7.455 7.422 7.455
3 1500x1500 25.370 25.386 25.973 25.576 25.973
4 2000x2000 63.488 66.801 67.333 65.874 67.333
5 2500x2500 134.567 134.812 134.185 134.521 134.812
6 3000x3000 246.558 240.936 240.891 242.795 246.558
7 3500x3500 395.057 393.168 388.070 392.098 395.057
8 4000x4000 566.025 665.869 757.783 663.226 757.783
Bảng 3: Tính toán Speed up và Efficiency dựa trên thời gian chạy trung bình
TT
Kích thước
ma trận
(NxN)
Without
OpenMP
OpenMP Speed up
Efficiency
(%)
1 500x500 2.138 0.85793 2.5 62.3
2 1000x1000 22.886 7.42234 3.1 77.1
3 1500x1500 72.994 25.576233 2.9 71.3
4 2000x2000 163.967 65.873985 2.5 62.2
5 2500x2500 348.877 134.52145 2.6 64.8

6 3000x3000 708.314 242.79499 2.9 72.9
7 3500x3500 1116.177 392.0983 2.8 71.2
8 4000x4000 1262.872 663.22578 1.9 47.6
Bảng 4: Tính toán Speed up và Efficiency dựa trên thời gian chạy lâu nhất
TT
Kích thước
ma trận
(NxN)
Without
OpenMP
OpenMP Speed up
Efficiency
(%)
1 500x500 2.226 0.905 2.5 61.5
2 1000x1000 23.276 7.455 3.1 78.1
3 1500x1500 73.431 25.973 2.8 70.7
4 2000x2000 173.586 67.333 2.6 64.5
5 2500x2500 352.504 134.812 2.6 65.4
6 3000x3000 744.628 246.558 3.0 75.5
7 3500x3500 1196.762 395.057 3.0 75.7
8 4000x4000 1277.624 757.783 1.7 42.2


Page 12


Hình 3:Biểu đồ so sánh thời gian tính toán trung bình

Hình 4:Biểu đồ so sánh thời gian tính toán lâu nhất


Page 13


Hình 5:Biểu đồ Speed Up

Hình 6:Biểu đồ Efficiency





Page 14

Kết luận
Qua kết quả thực nghiệm cho thấy: thời gian tính toán của lập trình song song
là nhanh hơn so với lập trình tuần tự. Khi kích thước ma trận càng lớn thì thời gian
tính toán của lập trình song song càng nhanh hơn so với lập trình tuần tự. Tốc độ của
lập trình song song lớn gấp 2 lần so với tính toán tuần tự.
Tuy nhiên, do việc đi sâu vào tiếp cận ứng dụng của OpenMP còn hạn chế chưa
thể khai thác hết các chỉ thị, các hàm thư viện và các biến môi trường nhằm mục đích
phân phối nhiệm vụ một cách hợp lý cho các bộ xử lý để song song hiệu quả hơn, tối
ưu hơn nữa cho bài toán nhân ma trận này.


Tài liệu tham khảo
[1] JOURNAL OF COMPUTATIONAL BIOLOGY Volume 7, Numbers 3/4, 2000
Mary Ann Liebert, Inc. Pp. 331–343 Algorithms for Identifying Boolean Networks and
Related Biological Networks Based on Matrix Multiplication and Fingerprint Function
TATSUYA AKUTSU, SATORU MIYANO, and SATORU KUHARA
[2] Rohit Chandra, Leonardo Dagum, Dave Kohr, Dror Maydan, Jeff

McDonald,
Ramesh Menon. Parallel Programming in
OpenMP

[3]
/>
[4]


[5]
l/computing/tutorials/workshop/openmp/
[6] http://www
hpcc.unical.it/alarico/LNErbacci2.pdf

[7] />


















Page 15

Phụ lục 1: Source Code nhân hai ma trận không sử dụng OpenMP
// Matrix Mul without omp.cpp : Defines the entry point for the console application.
//

// Nhan hai ma tran khong su dung OpenMP
#include "StdAfx.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <float.h>
#define N 4000 // Kich thuoc ma tran NxN
int main()
{
int **a,**b,**c;
clock_t start,end; //Bien thoi gian
int i,j,k;
double dif; // Bien qui doi thoi gian ra giay
//Cap phat bo nho cho ma tran A
a=(int **) malloc(10*N);
for( i=0;i<N; i++)
{
a[i]=(int *) malloc(10*N);
}

//Cap phat bo nho cho ma tran B

b=(int **) malloc(10*N);
for( i=0;i<N; i++)
{
b[i]=(int *) malloc(10*N);
}
//Cap phat bo nho cho ma tran tong
c=(int **) malloc(10*N);
for( i=0;i< N; i++)
{
c[i]=(int *) malloc(10*N);
}
printf("Khoi tao ma tran \n");
start =clock(); //Bat dau dem thoi gian
//Khoi tao ma tran A
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
a[i][j] = i+j;
}
}
//Khoi tao ma tran B
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
b[i][j] = i*j;
}
}
//Khoi tao ma tran C

for(i=0;i<N; i++)
{
for(j=0;j< N; j++)
{
c[i][j]=0;
}
}
Page 16

printf("Nhan hai ma tran \n");
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
for(k=0;k<N; k++)
{
c[i][j] +=a[i][k]*b[k][j];
}
}
}
end= clock(); //Thoi gian ket thuc
dif = ((double) (end - start)) / CLOCKS_PER_SEC; //Qui doi thoi gian ra giay
printf("Xong. Thoi gian thuc hien het: %f giay.\n", dif);
// Tien hanh giai phong bo nho cho cac ma tran da cap phat
for(i=0;i<N; i++)
{
free(a[i]);
}
free(a);
for(i=0;i<N; i++)

{
free(b[i]);
}
free(b);
for(i=0;i<N; i++)
{
free(c[i]);
}
free(c);
getch();
}

Phụ lục 2: Source Code nhân hai ma trận sử dụng OpenMP
/ Matrix Multiple.cpp : Defines the entry point for the console application.
//
// Nhan hai ma tran su dung OpenMP
#include "StdAfx.h"
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <omp.h>
#define N 4000// Kich thuoc ma tran NxN
int main(int argc, char *argv[])
{
int **a,**b,**c; // Khai báo mảng 2 chiều so nguyen
int tid,nthreads,chunk =10; //nthreads: bien de luu so threads duoc su dung;
tid: Bien de luu so thu tu cua thread
//chunk = 10: Sử dụng để chia trong vong lap For
double dif; //Bien luu thoi gian tinh toan
int i,j,k; // Bien su dung cho vong lap

/* Cap phat bo nho cho ma tran A */
a=(int **) malloc(10*N);
for( i=0;i<N; i++)
{
a[i]=(int *) malloc(10*N);
}
/* Cap phat bo nho cho ma tran B */
b=(int **) malloc(10*N);
for( i=0;i<N; i++)
{
b[i]=(int *) malloc(10*N);
Page 17

}
/* Cap phat bo nho cho ma tran C */
c=(int **) malloc(10*N);
for( i=0;i< N; i++)
{
c[i]=(int *) malloc(10*N);
}
printf("Khoi tao ma tran \n");
double start = omp_get_wtime( ); //Bat dau dem thoi gian

/*** Tao mot vung song song voi cac bien chia se giua cac thread gom: a,b,c nthread,
chunks va cac bien rieng duoc su dung cho cac thread la i,j,k ***/
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)
{
tid = omp_get_thread_num();
if(tid==0)
{

nthreads = omp_get_num_threads();// Lay so thread duoc su dung
printf("Bat dau nhan ma tran voi so thread la: %d
threads\n",nthreads);
}
//Khoi tao ma tran A
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread
voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule (static, chunk)
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
a[i][j] = i+j;
}
}
//Khoi tao ma tran B
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread
voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule (static, chunk)
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
b[i][j] = i*j;
}
}
//Khoi tao ma tran C
/* Khai bao mot vong lap duoc thuc hien song song giua cac thread
voi lich trinh Tinh va kich thuoc moi doan la 10*/
#pragma omp for schedule (static, chunk)

for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
c[i][j] = 0;
}
}
printf("Thread %d dang tien hanh nhan ma tran \n",tid);
#pragma omp for schedule (static, chunk)
for(i=0;i<N; i++)
{
for(j=0;j<N; j++)
{
for(k=0;k<N; k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
Page 18

}
}
} /*****Ket thuc vung song song*****/
double end = omp_get_wtime( ); //Thoi gian ket thuc
dif = end - start; //Khoang thoi gian thuc hien
printf("Xong.Thoi gian thuc hien la: %f giay.\n", dif);
/*Giai phong bo nho*/
for(i=0;i<N; i++)
{
free(a[i]);
}

free(a);
for(i=0;i<N; i++)
{
free(b[i]);
}
free(b);
for(i=0;i<N; i++)
{
free(c[i]);
}
free(c);
getch();
}

×