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

Tiểu luận môn PHÂN TÍCH & THIẾT KẾ GIẢI THUẬT NÂNG CAO Ứng dụng lập trình song song với MPI trong bài toán nhân hai 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 (608.94 KB, 15 trang )

Ứng dụng lập trình song song với MPI trong bài
toán nhân hai ma trận
Lê Phước Khiêm, Trần Quốc Lịnh, Phan Minh Nhật,
Nguyễn Thái Hùng, Võ Đăng Khoa, and Đinh Hoàng Văn Bửu Thịnh
Tóm tắt nội dung Bài báo này giới thiệu những kiến thức cơ bản về
tính toán song song và lập trình song song. Ngoài ra còn trình bày khái
niệm về MPI (Message Passing Interface), những nguyên tắc lập trình
song song với MPI. Sử dụng thư viện hàm MPI lập trình minh họa bài
toán nhân hai ma trận bằng thuật toán Fox. Rút ra những kết luận về
thời gian chạy chương trình bằng giải thuật tuần tự và bằng giải thuật
song song.
Key words: MPI, thuật toán Fox, lập trình song song, nhân ma trận
1 Giới thiệu
Sự phát triển và mở rộng phạm vi ứng dụng của công nghệ thông tin luôn gặp
phải hai thách thức lớn đó là không gian nhớ và tốc độ xử lí của máy tính. Một
số bài toán do thực tiễn và nghiên cứu lý thuyết đặt ra đòi hỏi phải xử lý nhanh
trên một cơ sở dữ liệu đồ sộ, đặc biệt là trong các lĩnh vực trí tuệ nhân tạo,
nhận dạng, xử lí ảnh, điều khiển tự động, mô phỏng, các bài toán dự báo. . . mà
các phương pháp và công cụ tính toán truyền thống không thể đáp ứng được.
Trong những trường hợp ấy, ta có thể tìm cách phân rã bài toán thành những
bài toán có kích thước và quy mô dữ liệu nhỏ hơn. Tuy nhiên điều đó không
phải bao giờ cũng có thể thực hiện. Xử lí song song (parallel processing) là một
trong những giải pháp giúp ta có thể xử lý tình huống nêu trên. Hiện nay có rất
nhiều chuẩn hỗ trợ lập trình song song như MPI hỗ trợ lập trình song song trên
bộ nhớ phân tán, OpenMP hỗ trợ lập trình trên bộ nhớ chia sẽ chung, Pthread
hỗ trợ lập trình luồng . . . Trong khuôn khổ bài báo này chỉ giới thiệu về MPI và
ứng dụng MPI vào lập trình song song bài toán nhân hai ma trận bằng thuật
toán Fox. Phần tiếp theo giới thiệu tổng quan về xử lý song song và tại sao cần
thiết phải xử lý song song Phần 3 sẽ giới thiệu tổng quan về MPI trong đó cho
biết MPI là gì, nguyên tắc lập trình MPI . Phần 4 sẽ mô tả bài toán nhân hai
ma trận bằng thuật toán Fox và ứng dụng MPI trong việc giải quyết bài toán.


2 Tính toán song song
2.1 Tính toán song song là gì?
Tính toán song song là việc sử dụng đồng thời các bộ đa xử lý để giải quyết một
vấn đề. Việc này được hoàn thành bằng cách tách vấn đề thành nhiều phần độc
2
lập sau đó mỗi bộ xử lý có thể chạy thuật toán của nó đồng thời với những cái
khác. Các bộ phận xử lý có thể khác nhau và bao gồm các dạng tài nguyên như:
một máy tính đơn gồm nhiều bộ đa xử lý, nhiều máy tính được kết nối mạng,
phần cứng chuyên biệt, hoặc có thể là sự kết hợp của những dạng trên.[5]
2.2 Tại sao phải xử lý song song?
Do yêu cầu thực tế ngày càng có nhiều bài toán với kích thước rất lớn và yêu
cầu xử lý tính toán phải nhanh. Tuy nhiên trong thực tế lại không tồn tại máy
tính có bộ nhớ vô hạn và khả năng xử lý vô hạn. Và cũng có nhiều bài toán mà
với giải thuật tuần tự không thể giải quyết được. Do đó việc sử dụng hệ thống
có nhiều bộ xử lý và các giải thuật song song để giải quyết các bài toán trên là
vô cùng cần thiết.
2.3 Các thành phần liên quan đến tính toán song song
– Kiến trúc máy tính song song.
– Phần mềm hệ thống.
– Giải thuật song song.
– Ngôn ngữ lập trình song song . . .
Trong khuôn khỗ bài báo này không giới thiệu chi tiết về các thành phần liên
quan đến tính toán song song mà chỉ giới thiệu về thư viện MPI hỗ trợ trong
việc lập trình xử lý song song trong Fortran 77 và C. Phần tiếp theo sẽ giới thiệu
tổng quan về MPI.
3 Tổng quan về MPI
3.1 MPI là gì
MPI, Message Passing Interface, một dạng giao thức kết nối của máy tính. MPI
là một thư viện các hàm hay thủ tục đã được chuẩn hóa hỗ trợ trong lập trình
song song có thể gọi được từ các ngôn ngữ Fortran, C, C++ hay Ada.

3.2 Mô hình lập trình message passing
Mô hình lập trình message passing được phát triển dựa trên ý tưởng lập trình
song song. Trong đó bài toán được chia thành nhiều phần nhỏ, mỗi phần được
giải quyết trên một processor với bộ nhớ riêng. Các phần này sẽ giao tiếp với
nhau qua một hoặc nhiều mạng để cùng nhau giải quyết vấn đề của bài toán.
Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận 3
[5]
Hình 1. Mô hình lập trình message passing
3.3 Các giao thức trong MPI
– Giao thức point to point
Giao thức point to point là giao thức đơn giản nhất trong truyền thông điệp.
Một thông điệp được truyền từ một processor tới một processor và chỉ hai
processor này mới biết được thông tin trong thông điệp đó
– Giao thức collective
Giao thức collective cho phép nhiều processor trao đổi thông điệp cùng nhau.
3.4 Nguyên tắc lập trình MPI
– Tất cả chương trình sử dụng MPI phải bắt đầu với hàm MPI_Init và kết
thúc với hàm MPI_Finalize và MPI_Init chỉ được gọi một lần duy nhất
trong toàn bộ chương trình.
3.5 Các hàm MPI thường dùng
4
Tên hàm Ý nghĩa
MPI_Init() Khởi tạo bộ môi trường thực thi MPI, hàm này phải được gọi
trước tất cả các hàm MPI khác, và chỉ được gọi một lần.
MPI_Finalize() Dùng để kết thúc môi trường thực thi MPI. Hàm này phải được
gọi cuối cùng trong tất cả các hàm MPI
MPI_Comm_size(
MPI_COMM_WORLD,
&size)
Xác định số lượng tiến trình tham gia vào một bộ giao

tiếp, thông thường, nó được dùng trong bộ giao tiếp
MPI_COMM_WORLD bộ giao tiếp được xây dựng sẵn, bao
gồm tất cả các tiến trình tham gia vào chương trình
MPI_Comm_rank(
MPI_COMM_WORLD,
&rank)
Xác định thứ tự của tiến trình này trong bộ giao tiếp. Lúc ban
đầu mỗi tiến trình được gán cho một số thứ tự từ 0 tới n-1 trong
bộ giao tiếp MPI_COMM_WORLD
MPI_Finalized(&flag) Kiểm tra xem hàm MPI_Init() đã được gọi hay chưa
MPI_Barrier() Đồng bộ tất cả các tiến trình trong hệ thống, khi hàm này được
gọi, tất cả các tiến trình sẽ cùng chờ cho tới khi tiến trình cuối
cùng thực hiện đến bước này và tất cả cùng thực hiện câu lệnh
tiếp theo vào cùng một thời điểm
MPI_Wtime() Xác định thời gian của hệ thống
MPI_Wtick() Xác định độ chính xác của thời gian hệ thống
MPI_Reduce(void *local,
void *global, int count,
MPI_Datatype type,
MPI_Op operator, int root,
MPI_Comm comm)
Hàm tình gộp, dùng để gộp các kết quả của từng tiến trình vào
kết quả chung. Trong đó, local là kết quả cục bộ, global là kết
quả nhận được sau khi tính gộp các kết quả cục bộ, type là kiểu
dữ liệu tính gộp, operator là thao tác tính gộp, root là thứ tự
của tiến trình sẽ nhận được kết quả global, comm là bộ giao tiếp
MPI_Send()
MPI_Receive()
3.6 Các kiểu thường dùng với MPI
Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận 5

Tên Kiểu dữ liệu C tương đương
MPI_CHAR signed char
MPI_DOUBLE double
MPI_FLOAT Float
MPI_INT Int
MPI_LONG Long
MPI_LONG_DOUBLE long double
MPI_SHORT Short
MPI_UNISIGNED_CHAR unsigned char
MPI_UNISIGNED unsigned int
MPI_UNSIGNED_LONG unsigned long
MPI_UNSIGNED_SHORT unsigned short
4 Bài toán nhân ma trận và thuật toán Fox
4.1 Bài toán nhân hai ma trận với thuật toán tuần tự
Định nghĩa bài toán nhân hai ma trận rất đơn giản. Cho ma trận A có kích
thước m x n, và ma trận B có kích thước n x p. Ma trận C có kích thước m x p
là kết quả của phép toán nhân ma trận A và B có phần tử ở hàng thứ i cột thứ
j được xác định bởi:
c
ij
=
n

k=1
a
ik
b
kj
Cách giải quyết trực tiếp trên một máy tính là dùng các vòng lặp:
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]
Với cách cài đặt này thì thời gian để tính phép nhân ma trận A x B là (n
3
).
Đến cuối những năm 1960, Strassen đưa ra một giải pháp cải tiến thuật toán
trên, nó có tính đột phá trong lịch sử của thuật toán chia để trị và ông đã tính
được T (n) = O(n
lg 7
) = O(n
2.81
)
4.2 Thuật toán Fox [1]
Tuy Strassen đã tìm ra cách giảm bớt đáng kể thời gian tính toán trong bài toán
nhân hai ma trận, song với số lượng phần tử mảng lớn thì rất ít người đủ kiên
nhẫn để ngồi chờ kết quả. Vì vậy đã có nhiều người giải bài toán này bằng thuật
toán song song như phương pháp chia dữ liệu cho các tác vụ theo dòng, theo cột
6
hoặc theo khối. Ở đây chúng ta sẽ tìm hiểu giải thuật Fox cho bài toán nhân hai
ma trận và so sánh tính ưu việt của nó so với cách giải thuật tuần tự như thế nào.
Để đơn giản, chúng ta giả định rằng
- Các ma trận vuông n ∗ n
- Số lượng processes là n
2
Giải thuật Fox chia dữ liệu mảng A theo đường chéo
[5]
Hình 2. Giải thuật Fox
1: procedure FoxAlgorithm
2: Group p=new Procs2(P,P);

3: Range x=p.dim(0);
4: Range y=p.dim(1);
5: while on(p) do
6: float [[#,#, , ]] a = new float [[x,y,B,B]];
7: float [[#,#, , ]] b = new float [[x,y,B,B]];
8: float [[#,#, , ]] c = new float [[x,y,B,B]];
9: float [[#,#, , ]] temp = new float [[x,y,B,B]];
10: for k=0 p-1 do
11: while over(Location i=x|:) do
12: float [[,]] sub = new float [[B,B]];
13: Adlib.remap(sub, a[[i, (i+k)%P, z, z]]);
14: while over(Location j=y|:) do
15: matmul(c[[i, j, z, z]], sub, b[[i, j, z, z]]);
Ứng dụng lập trình song song với MPI trong bài toán nhân hai ma trận 7
16: end while
17: end while
18: //Cyclic shift ’b’ in ’y’ dimension
19: Adlib.shift(tmp, b, 1, 0, 0); // dst, src, shift, dim, mode;
20: Adlib.copy(b, tmp);
21: end for
22: end while
23: end procedure
Ở thuật toán này thời gian được tính:
T
p
=
n
3
p
+ 2t

w
n
2

p
+ t
s
p
Trong đó t
s
là thời gian bắt đầu (startup time) t
w
thời gian truyền mỗi từ (per
-word transfer time)
4.3 Kết quả thực nghiệm
nghiem.jpg [5]
Hình 3. Biểu đồ so sánh thời gian thực hiện giải thuật Fox với thuật giải tuần tự
Nhìn vào biểu đồ trên ta thấy giải thuật song song chạy trên 1 Core sẽ chậm
hơn giải thuật tuần tự và với kích thước mảng nhỏ thì giải thuật song song và
tuần tự không có gì khác biệt lớn, nhưng với kích thước mảng đủ lớn thì giải
thuật song song chạy trên nhiều Core sẽ nhanh hơn rất nhiều đây chính là ưu
điểm của giải thuật song song.
8
5 Kết luận
Cùng với sự phát triển mạnh mẽ của khoa học kỹ thuật và hạ tần công nghệ
thông tin việc phát triển các ứng dụng số và nhu cầu số hóa tài liệu phục vụ học
tập, nghiên cứu, công việc kinh doanh, lưu trữ . . .đã làm cho lượng dữ liệu ngày
càng đồ sộ. Bên cạnh đó xã hội loài người hiện nay còn phải đối diện với nhiều
mối hiểm họa từ thiên nhiên cung như từ con người như động đất, sóng thần,
thiên tai, bệnh dịch, tội phạm, chiến tranh, khủng hoảng kinh tế . . . Để tìm kiếm

thông tin từ kho dữ liệu khổng lồ hay giúp giảm bớt những rũi ro trong cuộc
sống đồng thời tìm kiếm những giải pháp tốt đẹp cho tương lai thì con người
bắt buộc phải dùng những chương trình máy tính để thực hiện. Nhưng với tốc
độ xử lí cùng bộ nhớ của máy tính có hạn thì việc lập trình truyền thống sẽ khó
thực hiện và không đem lại kết quả như mong muốn. Do đó lập trình song song
là một lựa chọn tối ưu cho bài toán của thời đại.
Tài liệu
1. />2. Pgs.TS Trần Cao Đệ. Slide tính toán song song. 2008
3. Wolfgang Baumann Writing Message-Passing Parallel Programs with MPI. The Uni-
versity of Edinburgh
4.
5. />LẬP TRÌNH SONG SONG VỚI OPENMP
Nguyễn Trung Việt, Nguyễn Minh Toàn, Hà Lê Ngọc Dung,
Trịnh Trần Nguyễn, Trần Huỳnh Anh, Phan Ngọc Diễn
, ,
, ,
Tóm tắt nội dung Bài viết này trình bày một cách tổng quan về lập
trình song song với OpenMP, những ưu điểm của mô hình lập trình song
song với mô hình tuần tự. Dùng bài toán tìm số số nguyên tố trong một
giới hạn cho trước để minh họa cho phần lý thuyết đã nghiên cứu, với
những bộ số thực nghiệm khác nhau đã cho ra thời gian chênh lệch giữa
thực thi song song và tuần tự khác nhau. Trong xử lý công việc, thời
gian thực thi của một chương trình được lập trình song song luôn ít hơn
so với lập trình tuần tự. Qua nghiên cứu cho thấy lập trình song song
không phải là khái niệm mới và nó đang là xu thế của những lĩnh vực
ứng dụng công nghệ thông tin, đặc biệt là những lĩnh vực cần xử lý
những dữ liệu có kích thước lớn với một khoảng thời gian giới hạn.
Từ khóa: Lập trình song song, OpenMP
1 Tổng quan lập trình OpenMP
1.1 Giới thiệu về OpenMP (Open specifications for Multi

Processing)
Trước những năm 90, khái niệm lập trình song song đã xuất hiện, các nhà cung
cấp các máy tính chia sẻ bộ nhớ đã đưa ra các sản phẩm hỗ trợ sự đồng bộ và
các chỉ thị cơ bản sử dụng ngôn ngữ Fortran. Tuy nhiên mỗi nhà cung cấp có
những chuẩn riêng. Trải qua nhiều cải tiến, đầu năm 1997, chuẩn OpenMP được
đưa ra để làm một chuẩn chung hỗ trợ việc lập trình song song trên kiến trúc
chia sẻ bộ nhớ và phát triển cho đến nay.
OpenMP là một giao diện lập trình ứng dụng (API - Application Program
Interface) được sử dụng để điều khiển các luồng trên cấu trúc chia sẻ bộ nhớ
chung.
Thành phần của OpenMP bao gồm:
– Các chỉ thị biên dịch (Compiler Directives).
– Các thư viện runtime (Runtime Library Routines).
– Các biến môi trường (Emviroment Variables).
Ngoài ra còn có một số công cụ hỗ trợ như: công cụ điều khiển (Monitoring),
công cụ gỡ rối (Debugging), công cụ phân tích hiệu suất (Performance Analysis).
OpenMP Có thể dùng được trên hầu hết các máy với kiến trúc một không gian
nhớ (single memory space). OpenMP hoạt động trên sự liên kết chặt chẽ với
ngôn ngữ lập trình làm cơ sở như Fortran, C/C
++
.
OpenMP không tự động song song hóa chương trình, mà chỉ cung cấp cơ chế
để chỉ định việc thực hiện song song, chương trình thực hiện song song như thế
nào phụ thuộc vào người lập trình.
1.2 Mục tiêu của OpenMP
OpenMP ra đời với mục tiêu cung cấp một chuẩn chung cho rất nhiều kiến trúc
và nền tảng phần cứng. Thiết lập một tập các chỉ thị biên dịch hỗ trợ việc lập
trình song song trên máy tính chia sẻ bộ nhớ chung. Một mức song song chính
thường được thực thi với ba đến bốn chỉ thị.
OpenMP giúp cho việc lập trình song song một cách dễ dàng, cung cấp khả năng

song song hóa chương trình tuần tự mà không dùng đến thư viện thông điệp
OpenMP được sử dụng để giải quyết các vấn đề giới hạn về thời gian và có khối
lượng dữ liệu lớn như: dự báo thời tiết, mô phỏng tai nạn xe hơi, dự báo dòng
chảy thủy triều
1.3 Mô hình lập trình song song OpenMP
Có nhiều mô hình lập trình song song như: mô hình chia sẽ bộ nhớ (Shared
Memory Model), song song hóa dựa trên cơ chế luồng (Thread based parallelism),
mô hình song song hiện (Explicit Parallelism), mô hình Fork-Join OpenMP sử
dụng mô hình Fork-Join để thực thi công việc song song.
Hình 1. 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 thực thi
như một tiến trình đơn gọi là luồng chủ (master thread). Luồng chủ sẽ thực thi
tuần tự cho tới khi gặp vùng song song đầu tiên.Luồng chủ tạo nhóm các luồng
để chia sẻ thực hiện các công việc song song (FORK), khi hoàn thành đoạn mã
trong vùng song song, luồng song song sẽ được đồng bộ và kết thúc, luồng chủ
sẽ thực hiện tiếp công việc còn lại (JOIN).
1.4 Các chỉ thị trong OpenMP
Chỉ thị trong OpenMP xuất hiện như một câu "comment" trong mã nguồn và
được bỏ qua trong quá trình thực thi trừ khi được gắn cờ biên dịch (compiler
flag) báo hiệu việc "bật" hoặc "tắt" trình biên dịch OpenMP, chỉ thị được cho
dưới dạng:
# 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ị.

Ví dụ: # pragma omp parallel default ( shared ) private (beta,pi)
1.5 Thư viện Run-Time
OpenMP cung cấp thư viện omp.h 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, các hàm thiết lập môi trường thực thi.
Ví dụ:
– OMP_ SET_ NUM_ THREADS: thiết lập số lượng các luồng.
– OMP_ GET_ NUM_ THREADS: trả về số lượng các luồng thực hiện trong
vùng song song đang gọi hàm.
– OMP_ GET_ NUM_ PROCS: trả về số lượng các bộ xử lý thực thi chương
trinh tại thời điểm được gọi.
– OMP_ SET_ NESTED: cho phép hay không cho phép song song lồng.
– OMP_ INIT_ LOCK: hàm này dùng để thiết lập một khóa thông qua các
biến khóa.
1.6 Các 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.
Ví dụ:
– OMP_ SCHEDULE: chỉ được sử dụng trong chỉ thị có kiểu lập lịch RUN-
TIME như for và parallel for. Dùng để xác định các công việc trong vòng
lặp được lập lịch trên các bộ xử lý.
– OMP_ NUM_ THREADS: thiết lập số lượng lớn nhất các luồng được sử
dụng.
– OMP_ DYNAMIC: (TRUE hoặc FALSE) cho phép hay không cho phép sự
điều chỉnh động cho các luồng thực thi các vùng song song.
1.7 Viết chương trình song song với OpenMP
– Chia tách bài toán thành các công việc, lý tưởng nhất khi các công việc là
hoàn toàn độc lập.
– Gán công việc cho các luồng thực thi.
– Viết mã trên môi trường lập trình song song.
– Thiết kế chương trình phụ thuộc vào: nền tảng phần cứng, cấp độ song song,

bản chất của bài toán.
1.8 Trình biên dịch OpenMP
OpenMP được biên dịch thông qua những chỉ thị biên dịch nhúng trong mã
nguồn C/C
++
hoặc Fortran. Bài toán minh họa trong phần sau sử dụng trình
biên dịch Visual C
++
2010, .NET Framework 4.0
2 Bài toán đếm số số nguyên tố
Dãy số nguyên tố là vô hạn. Bài toán đặt ra là đếm số số nguyên tố trong khoảng
giới hạn cho trước. Một yêu cầu khác là tìm giải thuật tối ưu hoặc chấp nhận
được để thực hiện yêu cầu.
Ví dụ: đếm số số nguyên tố từ 2 đến 5.000.000
2.1 Thuật toán
Bao gồm 2 phần:
– Hàm kiểm tra số nguyên tố:
Ý tưởng: ý tưởng đầu tiên để kiểm tra một số m có phải là số nguyên tố hay
không là kiểm tra xem m có ước thuộc [2, m −1]. Tuy nhiên chỉ cần xét ước
của m trong [2,

m], vì nếu m là hợp số thì m chắc chắn có ước số không
vượt quá

m.
Một số phương pháp khác để xác định số nguyên tố: Kiểm tra theo xác suất,
Các phép kiểm tra tất định, Các phương pháp lý thuyết số , tuy nhiên các
phương pháp trên thực tế không phải là tối ưu.
– Hàm đếm số số nguyên tố: Cho một vòng for chạy từ 2 đến N. Với mỗi i ta
dùng hàm kiểm tra số nguyên tố vừa viết, kiểm tra xem i đó có phải là số

nguyên tố hay không. Nếu đúng thì tăng biến đếm số số nguyên tố lên 1 đơn
vị.
3 Cài đặt giải thuật
3.1 Theo cách thông thường
for i = 0 → (leghtMangSo − 1) do
for (j = 1 → mangSo[i]) do
if isSoNguyenTo(j) then
tongSoNguyenT o ← tongSoN guyenT o + +
end if
j ← j + 1
end for
i ← i + 1
end for
3.2 Cài đặt với OpenMP
for i = 0 → (leghtMangSo − 1) do
#pragma omp parallel {
#pragma omp for reduction ( + : tongSoNguyenTo )
for (j = 1 → mangSo[i]) do
if isSoNguyenTo(j) then
tongSoNguyenT o ← tongSoN guyenT o + +
end if
j ← j + 1
end for
}
i ← i + 1
end for
3.3 Thực nghiệm
Cách tạo dữ liệu
Dữ liệu được lấy từ file text “taptintest.txt”, trong đó mỗi dòng là một số
nguyên dương N (không giới hạn số lớn nhất). Chương trình đọc từng dòng, lấy

ra số nguyên dương N và thực hiện phép toán đếm các số nguyên tố có trong
khoảng từ 0 đến N.
VD: Trong file “taptintest.txt”, ta nhập vào các dòng sau:
10000
25000
Chương trình sẽ đếm các số nguyên tố có trong khoảng từ 0 đến 10000; từ 1
đến 25000; từ 1 đến 50000; từ 1 đến 70000.
Cách thức thu thập dữ liệu
Chương trình đánh giá hiệu quả của giải thuật song song so với giải thuật tuần
tự dựa trên tiêu chí thời gian theo đơn vị mili giây (một phần nghìn giây), theo
công thức sau:
T
th
= T
bd
− T
kt
– T
th
: Thời gian chương trình trả về kết quả đếm số nguyên tố có trong [2,N].
– T
bd
: Thời gian của hệ thống tại thời điểm bắt đầu vòng lặp for.
– T
kt
: Thời gian của hệ thống tại thời điểm kết thúc vòng lặp for chạy từ [2,N]
và trả về kết quả
Với mỗi số nguyên N, chương trình chạy thuật toán tuần tự, ghi lại thời gian
thực hiện; sau đó chạy thuật toán song song, ghi lại thời gian thực hiện. Dựa
trên kết quả ghi được, chương trình vẽ biểu đồ so sánh thời gian thực hiện của

hai thuật toán trên.
Biểu đồ so sánh, phân tích đánh giá
Chương trình minh họa so sánh thời gian thực thi của lập trình song song với
OpenMP và lập trình tuần tự. Đánh giá kết quả thực nghiệm
Hình 2. Demo chương trình
– Cùng một số nguyên N, thời gian thực hiện tại từng thời điểm là khác nhau,
do các nguyên nhân ảnh hưởng như: Cạnh tranh trong tính toán, chậm trễ
trong giao tiếp, gánh nặng đồng bộ hóa hoạt động các processors, điều khiển
hệ thống.
– Tốc độ của các processor ngày nay là rất cao, do đó giải thuật song song
không thể hiện sự vượt trội khi đầu vào là số nguyên N < 1000, thời gian
thực hiện giữa giải thuật song song và giải thuật tuần tự xấp xỉ bằng nhau
– Với N càng lớn, thời gian thực hiện của giải thuật song song càng hiệu quả.
– Gọi T1(n) là thời gian thực hiện tuần tự, T2(n) thời gian thực hiện song
song, p là số processor (máy tính đang chạy chương trình này có p=2), nhận
thấy:
T
1
(n)/pT
2
(n) < 1
Vậy với p processor, tốc độ khi chạy song song luôn nhỏ hơn p lần.
4 Kết luận
Lập trình song song với OpenMP giúp giảm thời gian tính toán so với chương
trình được lập trình tuần tự. Nhưng thời gian thực thi một chương trình song
song không phải lúc nào cũng giống nhau mà tùy thuộc vào tốc độ xử lý của
các processor và cách CPU phân chia công việc. Vì vậy, với cùng bộ dữ liệu mỗi
lần thực thi trên cùng một máy tính thì thời gian sẽ khác nhau.
Tài liệu
1. Lâm Thị Ngọc Châu. Giáo trình Toán rời rạc 3. (2005)

2. Trần Cao Đệ. Phân tích và Thiết kế Giải thuật nâng cao.(2012)
3. />

×