Ngày nay các chương trình chúng ta đang sử dụng thông thường là các chương trìnhđược viết theo các giải thuật tuần tự, nghĩa là một bài toán được giải quyết thông qua mộtchuỗi các câu lệ
Trang 1LỜI NÓI ĐẦU
Việc sử dụng các tài nguyên dùng chung ngày càng phổ biến, việc lưu trữ và xử lý dữliệu lớn càng được quan tâm, đã đưa nhu cầu tính toán trong lĩnh vực khoa học, công nghệngày càng cao Từ đó các giải pháp nhằm tăng tốc độ tính toán đã được ra đời Ban đầu,người ta thường sử dụng tăng tốc độ CPU để thu được kết quả tính toán nhanh, tuy nhiêntrong quá trình tăng tốc độ xung của CPU các nhà sản xuất đã gặp phải vấn đề về nhiệt độcủa CPU sẽ quá cao và các giải pháp tản nhiệt khí đã đến mức tới hạn không thể đáp ứngđược khả năng làm mát khi CPU hoạt động ở xung quá cao như vậy Vì vậy việc gia tăngxung hoạt động của CPU không sớm thì muộn cũng sẽ đi vào bế tắc
Trước tình hình này, các nhà nghiên cứu vi xử lý đã chuyển hướng sang phát triểncông nghệ đa lõi, đa luồng với cơ chế xử lý song song trong các máy tính nhằm tăng hiệunăng và tiết kiệm năng lượng Lập trình song song có thể giải quyết được các bài toán vớithời gian xử lý nhanh chóng
Qua môn học điện toán lưới và đám mây, người viết đã được tìm hiểu về các kỹ thuậtsong song hóa để cải thiện thời gian tính toán cho các bài toán, trong đó lập trình song
song xem như là công cụ mạnh Người viết xin gửi lời cảm ơn chân thành đến PGS.TS
Nguyễn Phi Khứ trường Đại học Công Nghệ Thông Tin và các quí Thầy Cô đã tận tình
giảng dạy, giúp đỡ để người viết hiểu thêm và hoàn thành tiểu luận này
Mặc dù đã rất nỗ lực, cố gắng nhưng kiến thức còn hạn chế nên bài viết không thểbao quát hết những kiến thức đã học, mục đích chủ yếu tiểu luận này là để ứng dụng kỹthuật song song hóa vào một vài giải thuật để tăng hiệu năng chương trình
Trang 2NHẬN XÉT CỦA GIẢNG VIÊN
Trang 3
MỤC LỤC
LỜI NÓI ĐẦU 1
NHẬN XÉT CỦA GIẢNG VIÊN 2
MỤC LỤC 3
Phần 1 CƠ SỞ LÝ THUYẾT 5
1.1 Tính toán song song 5
1.1.1 Giới thiệu 5
1.1.2 Xử lý song song 6
Bảng 1.1 So sánh XLTT và XLSS 6
1.1.3 Máy tính song song 7
1.2 Kiến trúc hệ thống song song 7
Bảng 1.2 Mô tả phân loại kiến trúc của Flynn 7
1.2.1 Kiến trúc SISD (đơn dòng lệnh dơn luồng dữ liệu) 7
1.2.2 Kiến trúc SIMD (đơn dòng lệnh da luồng dữ liệu) 8
1.2.3 Kiến trúc MISD (đa dòng lệnh đơn luồng dữ liệu) 9
1.2.4 Kiến trúc MIMD (đa dòng lệnh đa luồng dữ liệu) 10
1.3 Các mô hình lập trình song song 11
1.3.1 Lập trình bộ nhớ dùng chung 11
1.3.2 Lập trình truyền thông điệp 12
1.3.3 Mô hình song song dữ liệu 12
1.3.4 Mô hình hướng đối tượng 13
1.3.5 Mô hình logic 13
1.4 Kiến trúc máy tính song song 14
1.4.1 Máy tính truy cập ngẫu nhiên song song 14
1.4.2 Kiến trúc MISD theo nguyên lý hình ống 14
Bảng 1.3 Sắp xếp theo nguyên lý hình ống 15
1.5 Hiệu quả tính toán song song 16
Trang 41.5.1 Thời gian tính toán 16
1.5.2 Thời gian truyền thông 17
Phần 2 LẬP TRÌNH SONG SONG TRONG CSHARP 19
2.1 Task Parallel Librabry (TPL) 19
2.1.1 Task 19
2.1.2 Vòng lặp song song (Parallel loops) 20
2.1.2.1 Parallel.For() 21
2.1.2.2 Parallel.ForEach 22
2.1.3 Parallel.Invoke 23
2.1.3.1 Bài toán 1: using Parallel.invoke parallel, to view result output different.23 2.1.3.2 Bài toán 2: Encryption with 100 Unicode string using AES and MD5 25
2.1.4 AsParallel 26
2.2 Parallel Language INtegrated Query (PLINQ) 27
Phần 3 LẬP TRÌNH SONG SONG VỚI MPI 30
3.1 Cơ bản về truyền thông điệp 30
3.1.1 Mô hình truyển thông điệp 30
3.1.2 Hàm send và receive 30
3.2 MPI 31
3.2.1 Giới thiệu 31
3.2.2 Cấu trúc lệnh MPI 31
3.2.3 Sử dụng MPI trên Windows với visual C++ 32
3.2.4 Một số chương trình 36
3.2.4.1 Tìm số nguyên tố 36
3.2.4.2 Thuật toán QuickSort 39
KẾT LUẬN 44
TÀI LIỆU THAM KHẢO 45
Trang 5bộ nhớ và tại một thời điểm chỉ có một lệnh được thực thi.
Hình 1.1 Mô tả kiến trúc Von Neumann
Với những bài toán yêu cầu về khả năng tính toán và lưu trữ lớn thì mô hình kiếntrúc này còn hạn chế Để tăng cường sức mạnh tính toán giải quyết các bài toán lớn có độtính toán cao, người ta đưa ra kiến trúc mới, với ý tưởng kết hợp nhiều bộ xử lý vào trongmột máy tính, mà hay gọi là xử lý song song (Multiprocessor) hoặc kết hợp sức mạnh tínhtoán của nhiều máy tính dựa trên kết nối mạng (gọi là máy tính song song -multicomputer)
Ngày nay các chương trình chúng ta đang sử dụng thông thường là các chương trìnhđược viết theo các giải thuật tuần tự, nghĩa là một bài toán được giải quyết thông qua mộtchuỗi các câu lệnh tuần tự, thường thì bài toán này sẽ được thực hiện trên một máy tínhđơn với một BXL Tính toán song song là một bước tiếp theo và là tất yếu của sự phát triểncủa khoa học máy tính Tính toán song song, đó là sự giải quyết bài toán dựa trên sự thựcthi một cách đồng thời của nhiều tài nguyên máy tính Tài nguyên máy tính bao gồm:
- Một máy tính với nhiều BXL
- Nhiều máy tính đơn BXL kết nối với nhau
Trang 6- Kết hợp cả hai loại trên
Tính toán song song được sử dụng để giải quyết các vấn đề phức tạp yêu cầu thờigian tính toán lớn hoặc làm việc với khối lượng dữ liệu lớn như: các bài toán dự báo thờitiết,các vấn đề khoa học như khai phá dữ liệu, trí tuệ nhân tạo, xử lý ảnh ba chiều (3-D),
mô phỏng các hệ thống lớn Hầu hết các bài toán này, những máy tính xử lý tuần tự đềukhông đáp ứng được yêu cầu về thời gian và khối lượng công việc
1.1.2 Xử lý song song
Mặc dù tốc độ tính toán của các BXL tăng nhiều qua từng năm, nhưng do giới hạnvật lý nên khả năng tính toán của chúng không thể tăng mãi Nếu muốn tăng khả năng tínhtoán thì chúng ta phải khai thác được khả năng xử lý song song Xử lý song song là quátrình xử lý gồm nhiều tiến trình được kích hoạt đồng thời và cùng tham gia giải quyết mộtbài toán trên hệ thống có nhiều bộ xử lý
Hình 1.2 Mô tả xư lý song song
Sự khác nhau cơ bản giữa xử lý song song và xử lý tuần tự:
Bảng 2.1 So sánh XLTT và XLSS
Mỗi thời điểm chỉ thực hiện được 1 phép
Trang 71.1.3 Máy tính song song
Máy tính song song (MTSS) là một tập các bộ xử lý (BXL) (thường là cùng mộtloại) kết nối với nhau theo một kiểu nào đó để có thể hợp tác với nhau cùng hoạt động vàtrao đổi dữ liệu với nhau
Một trong những phân loại kiến trúc máy tính song song được biết đến nhiều nhất làphân loại của Flynn, được sử dụng từ năm 1966 Michael Flynn dựa vào đặc tính về sốlượng bộ xử lý, số chương trình thực hiện, cấu trúc bộ nhớ, … để phân máy tính thành bốnloại dựa trên sự biểu hiện của cặp khái niệm: dòng lệnh (Instruction stream) và dòng dữliệu (Data stream), mỗi loại nằm trong một trong hai trạng thái đơn (single) hoặc đa(multiple) được thể hiện trong bảng sau:
Bảng 2.2 Mô tả phân loại kiến trúc của Flynn Dòng lệnh
(Instruction stream) (Data stream) Dòng dữ liệu Loại kiến trúc
(multiple) Trạng thái đa(multiple) Multiple Instruction Multiple DataMIMD
1.2.1 Kiến trúc SISD (đơn dòng lệnh dơn luồng dữ liệu)
Máy tính SISD chỉ có một CPU, ở mỗi thời điểm thực hiện một chỉ lệnh và chỉ đọc,ghi một mục dữ liệu Tất cả các máy tính SISD chỉ có một thanh ghi (register) được gọi là
bộ đếm chương trình, được sử dụng để nạp địa chỉ của lệnh tiếp theo và kết quả là thựchiện theo một thứ tự xác định của các câu lệnh
Trang 8Hình 1.3 Mô hình SISD
Hình 1.4 Ví dụ mô hình SISD
1.2.2 Kiến trúc SIMD (đơn dòng lệnh da luồng dữ liệu)
Máy tính SIMD có một đơn vị điều khiển để điều khiển nhiều đơn vị xử lý thực hiện theomột luồng các câu lệnh CPU phát sinh tín hiệu điều khiển tới tất cả các phần xử lý, những
bộ xử lý này cùng thực hiện một phép toán trên cấc mục dữ liệu khác nhau, nghĩa là mỗi
bộ xử lý có luồng dữ liệu riêng
Hình sau đây mô tả mô hình SIMD, với
IS: Instruction Stream PU: Processing Unit
LM: Local Memory DS: Data Stream
Hình 1.5 Mô hình SIMD
Trang 9Hình 1.6 Ví dụ mô hình SIMD
Mô hình SIMD còn được gọi là SPMD, đơn chương trình và đa dữ liệu Đây chính là môhình máy tính phổ biến có trên thị trường như: DAP và Connection Machine CM-2
1.2.3 Kiến trúc MISD (đa dòng lệnh đơn luồng dữ liệu)
Máy tính loại MISD có thể thực hiện nhiều chương trình (nhiều lệnh) trên cùng một mục
dữ liệu (ngược với máy tính loại SIMD)
Hình sau đây mô tả mô hình MISD, với
IS: Instruction Stream PU: Processing Unit CU: Control Unit
LM: Local Memory DS: Data Stream
Hình 1.7 Mô hình MISD
Trang 10Hình 1.8 Ví dụ mô hình MISD
1.2.4 Kiến trúc MIMD (đa dòng lệnh đa luồng dữ liệu)
Máy tính loại MIMD gọi là đa bộ xử lý, trong đó mỗi bộ xử lý có thể thực hiện nhữngluồng lệnh (chương trình) khác nhau trên các luồng dữ liệu riêng Hầu hết các hệ thốngMIMD đều có bộ nhớ riêng và cũng có thể truy cập vào bộ nhớ chung khi cần, do vậygiảm thiểu được thời gian trao đổi dữ liệu giữa các bộ xử lý trong hệ thống Đây là loạikiến trúc phức tạp nhất, nhưng nó là mô hình hỗ trợ xử lý song song cao nhất và đã cónhiều máy tính được thiết kế theo kiến trúc này, ví dụ: BBN Butterfly, Alliant FX, iSPCcủa Intel,
Hình 1.9 Mô hình MIMD
Trang 11- Kiến trúc phần cứng là trong suốt đối với người lập trình.
- Trong kiến trúc tuần tự có thể tận dụng tốc độ cực nhanh của BXL để thực hiện xử
lý song song theo nguyên lý chia sẻ thời gian và chia sẻ tài nguyên
- Những chương trình song song trên máy đơn BXL có thể thực hiện được nếu cóHĐH cho phép nhiều tiến trình cùng thực hiện, nghĩa là có thể xem hệ thống như là
Trang 12Hình 1.11 Mô tả lập trình giữa các tác vụ dùng chung bộ nhớ
1.3.2 Lập trình truyền thông điệp
Trong máy tính song song cung cấp kỹ thuật truyền thông điệp để trao đổi giữa cáctác vụ Hai tác vụ nằm trên hai máy khác nhau có thể trao đổi với nhau bằng kỹ thuậttruyền thông điệp trên mạng kết nối Các thông điệp có thể là các lệnh, dữ liệu, tín hiệuđồng bộ hay ngắt Hai mô hình truyền thông điệp được thực thi và sử dụng là đồng bộ haykhông đồng bộ
Hình 1.12 Mô hình lập trình truyền thông giữa hai tác vụ trên hai máy tính
1.3.3 Mô hình song song dữ liệu
Trong mô hình song song dữ liệu, hầu hết các công việc song song đều tập trung thựchiện các phép toán trên một tập dữ liệu Tập dữ liệu này thường được tổ chức trong mộtcấu trúc dữ liệu thông dụng như mảng hoặc khối Một tập tác vụ sẽ làm việc trên cùng cấutrúc dữ liệu nhưng mỗi tác vụ sẽ làm việc trên một phần dữ liệu khác nhau với cùng phéptoán Mô hình song song dữ liệu thiết kế chủ yếu dành cho máy tính song song kiểu bộ xử
lý mảng
Trang 13Hình 1.13 Mô hình lập trình song song dữ liệu
1.3.4 Mô hình hướng đối tượng
Trong mô hình hướng đối tượng này, ánh xạ các đơn vị thực hiện vào các đối tượng.Các đối tượng được tạo ra và thao tác theo cách tự động, việc xử lý được thực hiện thôngqua gửi và nhận giữa các đối tượng Các mô hình lập trình hiện nay đều xây dựng các đốitượng từ mức thấp như tiến trình, tác vụ, hàng đợi và cờ tín hiệu đến mức cao như mô-đunchương trình
Các ngôn ngữ lập trình song song hướng đối tượng như: CORBA, DCE, JAVA,C/C++
1.3.5 Mô hình logic
Dựa trên cơ sở logic tiên đề, lập trình logic phù hợp cho xử lý trí thức giải quyết cơ
sở tri thức lớn Mô hình này chấp nhận một chiến lược tìm kiếm ẩn và hỗ trợ song songtrong xử lý suy luận logic Một câu hỏi được trả lời nếu hợp với các sự kiện được tìm thấytrong cơ sở dữ liệu Hai sự kiện hợp nhau nếu tiền đề của chúng và các đối kết hợp là nhưnhau Xử lý việc hợp và thống nhất có thể được song song dưới các điều kiện chắc chắn
Mô hình này được áp dụng song song cho các ứng dụng trí tuệ nhân tạo
Trang 141.4 Kiến trúc máy tính song song
1.4.1 Máy tính truy cập ngẫu nhiên song song
Chứa một đơn vị điều khiển CU, một bộ nhớ chung, một tập không giới hạn các BXL MỗiBXL lại có bộ nhớ riêng và có một chỉ số duy nhất được sử dụng để xác định địa chỉ trongquá trình trao đổi các tín hiệu và quản lý các ngắt Tất cả các BXL đều chia sẻ bộ nhớchung với yêu cầu không bị giới hạn Các câu lệnh có thể bắt đầu thực hiện ở bất kỳ thờiđiểm nào, ở bất kỳ vị trí nào của bộ nhớ (riêng hoặc chung)
Hình 1.14 Mô hình máy tính song song kiểu PRAM
1.4.2 Kiến trúc MISD theo nguyên lý hình ống
Bộ xử lý hình ống chính là bộ xử lý kiểu MISD Nguyên lý hình ống (pipeline): dựa trênnguyên tắc:
- Phân đoạn hoặc chia nhỏ một tiến trình thành một số tiến trình con để thực hiệntrong các pha liên tiếp
- Mỗi một giai đoạn của một tiến trình được thực hiện tuần tự Sau khi thực hiệnxong một pha thì bắt đầu thực hiện giai đoạn của tiến trình tiếp theo
- Mỗi pha thực hiện xong sẽ truyền kết quả cho pha tiếp theo
Tóm lại, theo nguyên lý hình ống: Khi một giai đoạn công việc đang thực hiện thì một giai
Trang 15đoạn khác có thể nạp dữ liệu vào, và dữ liệu vào của giai đoạn này có thể là kết quả củagiai đoạn trước nó.
Ví dụ sau đây cho thấy khác biệt giữa thực hiện tuần tự và hình ống của 2 tiến trình gồm 4giai đoạn:
Giả sử một tiến trình được chia thành 4 giai đoạn:
- Thực hiện tuần tự 2 tiến trình phải qua 8 giai đoạn:
- Thực hiện theo hình ống chỉ cần thực thi phải qua 8 giai đoạn:
- Tổng thời gian tính toán tuần tự là: 2 * (S1 + S2 + S3+ S4)
- Tổng thời gian tính toán hình ống là: S1 + S2 + S3 + S4 + S4
Có thể sử dụng n tiến trình kết hợp theo nguyên lý hình ống để sắp xếp mảng a[n] Hệthống được chia thành hai pha: Pha chẵn và pha lẻ Pha chẵn: Các tiến trình được đánh sốchẵn so với những tiến trình tiếp theo (tiến trình có số lẻ), nếu nó giữ phần tử lớn hơn thìđổi dữ liệu với tiến trình đó Pha lẻ: Các tiến trình có số lẻ hoạt động tương tự như trên
Ví dụ: Cho n = 8 và dãy số ban đầu là 6, 2, 8, 5, 1, 3, 4, 7 Kết quả sắp xếp theonguyên lý hình ống được thể hiện ở sau:
Trang 16Giải thuật này có độ phức tạp O(n).
1.5.1 Thời gian tính toán
Thời gian tính toán của giải thuật song song là thời gian dành để thực hiện tính toán.Đối với giải thuật tuần tự thì thời gian này chỉ phụ thuộc vào kích thước của bài toánnhưng với tính toán song song thì việc tính toán lặp trên các tác vụ có thể có Do đó thờigian tính toán sẽ phụ thuộc vào số tác vụ thực hiện Đối với mô hình bộ nhớ chung thì sốlượng bộ xử lý cũng ảnh hưởng đến tốc độ thực thi trên mỗi bộ xử lý
Thông thường có thể xác định bằng thời gian thực hiện tuần tự cộng với bất kỳ thờigian nào thêm vào do thực hiện song song Chẳng hạn như thời gian tính toán lặp lại cùngmột công việc trên các tác vụ
Trang 171.5.2 Thời gian truyền thông
Thời gian truyền thông của một giải thuật là thời gian các tác vụ dành để gửi và nhậnthông điệp Có hai loại truyền thông cần xác định: Truyền thông giữa hai tác vụ trên hai bộ
xử lý khác nhau và truyền thông giữa hai tác vụ cùng nằm trên cùng bộ xử lý Thôngthường thời gian truyền bên trong bộ xử lý lớn hơn nhiều so với thời gian truyền giữa hai
bộ xử lý, nhất là đối với mô hình máy tính song song
Trong mô hình máy tính song song lý tưởng thì chi phí để gửi một thông điệp giữahai tác vụ định vị trên bộ xử lý khác nhau phụ thuộc vào hai tham số sau:
Thời gian khởi tạo thông điệp: ts là thời gian cần thiết để khởi tạo truyền thông
Thời gian truyền dữ liệu: tw là thời gian cần thiết để truyền đi dữ liệu có kích thướcmột word (2 byte) tw được xác định bởi băng thông vật lý của kênh truyền thông kết nối
bộ xử lý nguồn và đích
Công thức tính thời gian gửi thông điệp có kích thước L (đơn vị là word) là:
T msg = t s + L t w
Nếu lượng dữ liệu truyền là nhỏ thì thời gian khởi tạo chiếm phần lớn, còn khi lượng
dữ liệu lớn thì thời gian truyền sẽ chiếm tỷ trọng cao, điều này được thể hiện qua hình sau:
Hình 1.15 Mô tả mối quan hệ các tham số tính thời gian truyền thông
Thông thường ts và tw là các thông số được tính toán phụ thuộc vào cụ thể kiến trúcmáy tính song song Tuy nhiên đối với mô hình máy tính song song thực tế, cần phân tích
sự ảnh hưởng của hai kỹ thuật định đường truyền thông là lưu trữ và chuyển tiếp (store andforward), chuyển mạch kênh (circuit-switched) cũng như ảnh hưởng của tranh chấp băngthông trên đường truyền giữa các bộ xử lý
Trang 18Trong sơ đồ của cơ chế lưu trữ và chuyển tiếp, thời gian cần thiết để gửi một thôngđiệp từ một bộ xử lý tới một bộ xử lý khác tăng tuyến tính với số bước nhảy mà thôngđiệp phải tạo ra để đến được đích Ngược lại, thời gian cần thiết để gửi một thông điệp từmột bộ xử lý tới một bộ xử lý khác trong lược đồ chuyển mạch là phụ thuộc rất ít vớikhoảng cách giữa các bộ xử lý
Do đó có thể phát triển thành các công thức sau:
- Đối với truyền thông định đường theo cơ chế lưu trữ và chuyển tiếp:
T msg = ( t s + t w L) D
Với D là khoảng cách giữa nút nhận và gửi trong bước định đường
- Đối với truyền thông định đường theo cơ chế chuyển mạch kêmh:
Trang 19Phần 2 LẬP TRÌNH SONG SONG TRONG CSHARP
2.1.1 Task
Chương trình cần lấy dữ liệu từ database, nó sẽ truy vấn đến database thông quaLINQ, sau đó được đưa đến các thư viện chứa các Task (Task Parallel Library- viết tắt làTPL) Tại đây chương trình sẽ được chia nhỏ thành các tác vụ và được lập lịch hoạt động(task sheduling) Kết quả ta thu được các threads và các threads này sẽ được sử lý đồngthời Nếu chương trình không cần lấy dữ liệu từ database, ta sẽ thao tác trực tiếp và trựctiếp tạo ra các task
Hình 1.1 Mô hình máy tính song song kiểu PRAM
Như đã trình bày ở trên, mô hình lập trình song song sẽ chia nhỏ chương trình ra thành cáctác vụ nhỏ (task) Để sử dụng TPL ta cần thêm không gian tên System.Threading.Task,NET Framework 4 cung cấp cho ta rất nhiều cách để khai báo và khởi tạo 1 Task
// use an Action delegate and a named method
Task task1 = new Task(new Action(printMessage));
// use a anonymous delegate
Trang 20Task task2 = new Task(delegate { printMessage(); });
// use a lambda expression and a named method
Task task3 = new Task(() => printMessage());
// use a lambda expression and an anonymous method
Task task4 = new Task (() => { printMessage();} );
Mỗi một task khi ta khai báo sẽ được máy tính biên dịch và chạy đồng thời Tuy nhiên tacũng có thể định thời gian hoạt động cho các task
Hủy bỏ một task : trong không gian tên System.Thread ta sử dụng phương thứcCancellationTokenSource để hủy bỏ một task Việc hủy bỏ một tác vụ được sửdụng đến khi chương trình đang hoạt động mà ta muốn can thiệp và dừng 1 tácdụng nào đó lại
Tác vụ chờ : khi ta không muốn một tác vụ nào đấy thực hiện ngay, mà chờ đợi
1 khoảng thời gian nhất định Ta sẽ sử dụng phương thức Thread.Sleep() vàThread.SleepWait()
Ta cũng có thể bắt 1 Task thực hiện sau khi tất cả các task khác đã thực hiện xonghoặc chờ đợi sau bao lâu bằng việc sử dụng phương thức Task.Wait();
2.1.2 Vòng lặp song song (Parallel loops)
Như chúng ta đã biết các vòng lặp tuần tự thông thường như for, do while, chươngtrình sẽ phải chạy tuần tự từng vòng lặp cho đến khi gặp lệnh kết thúc Như vậy sẽ rất tốnthời gian, trong khi CPU của chúng ta vẫn còn đang rảnh rỗi (chờ thực hiện xong vòng lặpnày rồi mới thực hiện vòng lặp tiếp theo) Để khắc phục điều này, mô hình lập trình songsong cho phép chúng ta thực hiện song song các vòng lặp Thay vì phải thực hiện lần lượtcác vòng lặp, CPU có thể thực hiện được đồng thời nhiều vòng lặp cùng lúc Từ đó giúptiết kiệm thời gian
Trang 21- Sequential for Version
private static void GenerateMD5Hashes()
byte [] result = md5M.ComputeHash(data);
string hexString = ConvertToHexString(result);
Console WriteLine( "MD5 HASH: {0}" , hexString);
}
Debug WriteLine( "MD5: " + sw.Elapsed.ToString());
}
- Parallel for Version
private static void ParallelGenerateMD5Hashes()
{
var sw = Stopwatch StartNew();
Parallel For(1, NUM_MD5_HASHES + 1, ( int i) =>
{
var md5M = MD5 Create();
byte [] data = Encoding Unicode.GetBytes( Environment UserName +
i.ToString());
byte [] result = md5M.ComputeHash(data);
string hexString = ConvertToHexString(result);
Console WriteLine( "MD5 HASH: {0}" , hexString);
});
Debug WriteLine( "MD5: " + sw.Elapsed.ToString());
}
Trang 222.1.2.2 Parallel.ForEach
Vòng lặp ForEach() : sử dụng phương thức Parallel.ForEach(), vòng lặp này linh hoạt hơn
so với vòng lặp trước, nhờ việc cho phép cải biên dữ liệu đầu vào
Xét ví dụ :
List<string> dataList = new List<string> {
"the", "quick", "brown", "fox", "jumps", "etc" };
Ví dụ sau đây, phương thức ParallelParitionGenerateMD5Hashes với việc sử dụng vònglặp tuần tự và song song:
private static void ParallelPartitionGenerateMD5Hashs()
{
var sw = Stopwatch StartNew();
Parallel ForEach( Partitioner Create(1, NUM_MD5_HASHS + 1), range =>
string hexString = ConvertToHexString(result);
Console WriteLine( "MD5 HASH: {0}" , hexString);