chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình...

53
chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng. May mắn thay, nhiều phương pháp cho phép các nhà phát triển để tập trung vào mức độ cao hơn của thiết kế ứng dụng và để lại các cơ chế quản lý chủ đề và chia sẻ dữ liệu với thời gian chạy các thư viện và các trình biên dịch. Trong một trường hợp lý tưởng, trình biên dịch quản lý tất cả mọi thứ, từ việc xác các bộ phận của các mã để chạy song song thông qua việc cung cấp các cơ chế hỗ trợ song song đó. Tuy nhiên, nếu không có sự giúp đỡ từ các nhà phát triển, công nghệ trình biên dịch hiện tại sẽ hiếm khi có thể khai thác tất cả các xử lý song song trong một ứng dụng. Việc mở rộng ngôn ngữ thông dụng nhất và thường có sẵn cho xử lý song song là OpenMP API. Các đặc điểm kỹ thuật OpenMP định nghĩa một API cho phép các nhà phát triển để thêm chỉ thị để mã nối tiếp của họ sẽ gây ra các trình biên dịch để sản xuất một phiên bản song song của các ứng dụng. Chương này mô tả cả hai song song tự động được cung cấp bởi nhiều trình biên dịch và làm thế nào các API OpenMP có thể sản xuất các ứng dụng song song từ các mã số serial. Sử dụng song song tự động để sản xuất một ứng dụng song song. Hầu hết các trình biên dịch có thể thực hiện một số mức độ song song tự động. Trong một thế giới lý tưởng, song song tự động sẽ chỉ là một tối ưu hóa trình biên dịch, nhưng hiện tại có những hạn chế đáng kể vào những gì có thể đạt được. Đây là ndoubtedly một khu vực mà sẽ cải thiện trong thời gian. Tuy nhiên, trong nhiều trường hợp, nó có thể hỗ trợ các trình biên dịch trong việc đưa ra các mã song song. Trong phần này, chúng ta sẽ khám phá những khả năng của cả Oracle Solaris Studio và Intel trình biên dịch để thực hiện song song tự động. Cũng như khả năng thực hiện song song tự động, nó cũng quan trọng cho các trình biên dịch để có thể cung cấp thông tin phản hồi trên các phần của mã được song song và những gì ức chế song song của các khu vực khác của mã. Trình biên dịch hiện tại chỉ có thể tự động parallelize vòng. Loops là một mục tiêu rất tốt cho song song bởi vì chúng thường được nhắc đi nhắc lại, vì vậy các khối mã do đó sẽ tích lũy thời gian đáng kể. Như đã thảo luận trước đó, bất kỳ khu vực song song phải thực hiện các công việc quan trọng để vượt qua bất kỳ chi phí mà phải gánh chịu song song.

Upload: nguyen-ba-quan

Post on 06-Feb-2016

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng. May mắn thay, nhiều phương pháp cho phép các nhà phát triển để tập trung vào mức độ cao hơn của thiết kế ứng dụng và để lại các cơ chế quản lý chủ đề và chia sẻ dữ liệu với thời gian chạy các thư viện và các trình biên dịch. Trong một trường hợp lý tưởng, trình biên dịch quản lý tất cả mọi thứ, từ việc xác các bộ phận của các mã để chạy song song thông qua việc cung cấp các cơ chế hỗ trợ song song đó. Tuy nhiên, nếu không có sự giúp đỡ từ các nhà phát triển, công nghệ trình biên dịch hiện tại sẽ hiếm khi có thể khai thác tất cả các xử lý song song trong một ứng dụng. Việc mở rộng ngôn ngữ thông dụng nhất và thường có sẵn cho xử lý song song là OpenMP API.

Các đặc điểm kỹ thuật OpenMP định nghĩa một API cho phép các nhà phát triển để thêm chỉ thị để mã nối tiếp của họ sẽ gây ra các trình biên dịch để sản xuất một phiên bản song song của các ứng dụng. Chương này mô tả cả hai song song tự động được cung cấp bởi nhiều trình biên dịch và làm thế nào các API OpenMP có thể sản xuất các ứng dụng song song từ các mã số serial.

Sử dụng song song tự động để sản xuất một ứng dụng song song.

Hầu hết các trình biên dịch có thể thực hiện một số mức độ song song tự động. Trong một thế giới lý tưởng, song song tự động sẽ chỉ là một tối ưu hóa trình biên dịch, nhưng hiện tại có những hạn chế đáng kể vào những gì có thể đạt được. Đây là ndoubtedly một khu vực mà sẽ cải thiện trong thời gian. Tuy nhiên, trong nhiều trường hợp, nó có thể hỗ trợ các trình biên dịch trong việc đưa ra các mã song song.

Trong phần này, chúng ta sẽ khám phá những khả năng của cả Oracle Solaris Studio và Intel trình biên dịch để thực hiện song song tự động. Cũng như khả năng thực hiện song song tự động, nó cũng quan trọng cho các trình biên dịch để có thể cung cấp thông tin phản hồi trên các phần của mã được song song và những gì ức chế song song của các khu vực khác của mã.

Trình biên dịch hiện tại chỉ có thể tự động parallelize vòng. Loops là một mục tiêu rất tốt cho song song bởi vì chúng thường được nhắc đi nhắc lại, vì vậy các khối mã do đó sẽ tích lũy thời gian đáng kể. Như đã thảo luận trước đó, bất kỳ khu vực song song phải thực hiện các công việc quan trọng để vượt qua bất kỳ chi phí mà phải gánh chịu song song.

Page 2: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Trình biên dịch Solaris Studio C sử dụng lá cờ xautopar để cho phép tự động song song và cờ xloopinfo để báo cáo thông tin về mức độ song song được. Bảng liệt kê 7.2 cho thấy kết quả biên dịch đoạn mã này.

Có hai vòng trong mã này, và mặc dù các trình biên dịch đã được quản lý để parallelize vòng đầu tiên, nó đã không thể parallelize vòng thứ hai. Trình biên dịch báo cáo rằng các cuộc gọi chức năng trong vòng lặp thứ hai dừng lại song song của các loop.We sẽ thảo luận về tránh vấn đề này ở phần sau của.

Trình biên dịch Intel sử dụng các tùy chọn để cho phép song song song song và các tùy chọn mệnh báo cáo để báo cáo thành công của nó. Các trình biên dịch cũng có ngưỡng tùy chọn mệnh {n}, kiểm soát ngưỡng mà các trình biên dịch sẽ parallelize một vòng lặp. Các tùy chọn mệnh threshold0 sẽ làm cho trình biên dịch parallelize tất cả các vòng ứng cử viên; mặc định mệnh threshold100 chỉ ra rằng trình biên dịch nên parallelize chỉ những vòng mà chắc chắn sẽ được hưởng lợi. Bảng liệt kê 7.3 cho thấy sản lượng từ các biên dịch của Intel trên các tập tin cùng một nguồn. Lá cờ fno chức năng vô hiệu hóa chức năng nội tuyến nội tuyến trong các trình biên dịch và đảm bảo rằng các mã được tạo ra là như nhau cho hai trình biên dịch.

Page 3: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Số lượng đề song song được sử dụng trong vòng lặp được kiểm soát bởi các biến môi trường OMP NUM đề. Bảng liệt kê 7.4 cho thấy hiệu suất của mã khi chạy với một và hai chủ đề. Nó rất hữu ích để kiểm tra thời gian báo cáo cho các mã nối tiếp và song song. Thời gian sử dụng là như nhau trong cả hai trường hợp, trong đó chỉ ra rằng hai mã đã cùng một số lượng công việc. Tuy nhiên, thực tế, hoặc tường, thời gian là ít hơn cho các phiên bản song song. Điều này là để được mong đợi. Phát tán một lượng không đổi công việc qua hai đề lý tưởng sẽ dẫn đến mỗi thread hoàn tất một nửa công việc.

Như một ví dụ phức tạp hơn song song tự động, xem xét các vòng lặp trong Liệt kê 7.5, mà sẽ nhân một ma trận của một véc tơ và đặt kết quả trong một vector thứ hai.

Bảng liệt kê 7.6 cho thấy kết quả của biên dịch mã này với trình biên dịch Solaris Studio.

Trình biên dịch không công nhận một trong các vòng lặp for như vòng mà có thể được song song. Lý do cho điều này là khả năng khử răng cưa giữa các cửa hàng để ra [i] và các giá trị được sử dụng để xác định các vòng ràng buộc, * hàng * và col. Một yêu cầu để trình biên dịch tự động parallelize vòng lặp là các giới hạn vòng lặp phải duy trì liên tục. Một cửa hàng cho một trong những ranh giới vòng

Page 4: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

lặp sẽ vi phạm hạn chế đó. Vì vậy, nó không phải là một hình thức của vòng lặp có thể được tự động song song. Là một lập trình, nó sẽ là bất thường để viết mã mà dựa vào các cửa hàng để các phần tử trong mảng thay đổi ranh giới vòng lặp, nhưng đối với các trình biên dịch, các giả định an toàn duy nhất là những sức mạnh bí danh.

Cách mục đích chung nhất của sửa chữa này là đặt các giới hạn vòng lặp thành các biến cục bộ tạm thời. Điều này loại bỏ khả năng rằng các giới hạn vòng lặp sức bí danh với một trong các cửa hàng trong vòng lặp. Đối với các mã trong Liệt kê 7.5, nó rất dễ dàng để thực hiện các thay đổi tương đương và vượt qua các giới hạn vòng lặp theo giá trị chứ không chuyển chúng như con trỏ đến các giá trị. Bảng liệt kê 7.7 cho thấy các vòng lặp sửa đổi

Liệt kê 7.8 cho thấy sản lượng từ các trình biên dịch khi biến thể mới của mã là biên soạn.

Việc sửa đổi mã đã kích hoạt các trình biên dịch để nhận ra các vòng là ứng cử viên

cho song song, nhưng trình biên dịch đã đạt một vấn đề vì các yếu tố chỉ ra bởi hiện sức mạnh bí danh với các yếu tố chỉ ra, hoặc bởi các ma trận, mat, hoặc bởi các vector, vec. Một cách để giải quyết điều này là sử dụng một con trỏ hạn chế đủ điều kiện để giữ vị trí của mảng đầu ra. Bảng liệt kê 7.9 chỉ mã đổi cho điều này.

Page 5: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Sau khi điều chỉnh này đối với mã nguồn, trình biên dịch có thể sản xuất một phiên bản song song của vòng lặp, như trong Liệt kê 7.10.

Trình biên dịch Solaris Studio tạo ra hai phiên bản của vòng lặp, một phiên bản song song và một phiên bản nối tiếp. Khi chạy, các trình biên dịch sẽ xác định xem số lượng chuyến đi của vòng lặp là đủ cao cho các phiên bản song song để chạy nhanh hơn so với các phiên bản nối tiếp.

Trình biên dịch báo cáo rằng các vòng lặp ở dòng 8 trong Liệt kê 7.9 có một sự phụ thuộc không an toàn, ông lý do cho quyết định này sẽ được thảo luận trong phần tiếp theo, "Xác định và Giảm parallelizing."

Trong hai vòng trong các mã, các trình biên dịch song song quá trình vòng ngoài nhưng không phải các vòng trong. Đây là quyết định tốt nhất để làm cho hiệu suất. Các chủ đề thực hiện các công việc cần song song để đồng bộ hóa một khi công việc đã hoàn thành song song. Nếu các vòng ngoài lý song song, sau đó các chủ đề cần phải đồng bộ hóa chỉ một lần các vòng ngoài đã hoàn tất. Nếu các vòng trong đã được thực hiện song song, sau đó các chủ đề sẽ phải đồng bộ hóa mỗi lần một lần lặp của vòng lặp bên ngoài hoàn thành. Số lượng các sự kiện đồng bộ hóa sẽ bằng với số lần mà các vòng ngoài là iterated.Hence, đó là hiệu quả hơn để làm cho các vòng ngoài song song

Xác định và parallelizing Giảm

Khi một vòng lặp làm giảm một số lượng lớn các dữ liệu xuống một tập hợp nhỏ hơn các giá trị, các hoạt động được gọi là giảm. Các ví dụ điển hình của việc giảm được tính tổng của một dãy số, như thể hiện trong Liệt kê 7.11.

Page 6: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Để tạo ra một giảm song song, các nhà điều hành giảm cần phải được hoán thực hiện các hoạt động theo một thứ tự khác nhau không phải gây ra một kết quả không chính xác. Các hoạt động giảm có thể là cộng, trừ, nhân, và các hoạt động hợp lý, chẳng hạn như AND hoặc OR, cũng như các hoạt động MIN và MAX khi áp dụng cho một dãy số.

Tuy nhiên, một số hoạt động trên các số dấu chấm động không thể được sắp xếp lại mà không gây ra một số khác biệt số tiềm năng để đầu ra. Việc bổ sung các giá trị dấu chấm là một ví dụ tốt về điều này. Có những tình huống mà thêm A và B và sau đó C sẽ cho một giá trị số khác nhau vì thêm C và A và sau đó B. Thứ tự của các hoạt động này là quan trọng. Đây không phải là một vấn đề duy nhất để mã song song; mã số serial có những hạn chế đặt hàng cùng. Tuy nhiên, đối với mã song song, hạn chế này có thể ngăn chặn một trình biên dịch từ sản xuất một phiên bản song song của một cấu trúc mã.

xem xét một ví dụ giả tạo, giả sử bạn có một mảng các số dấu chấm động được sắp xếp từ các yếu tố lớn nhất để các phần tử nhỏ nhất. Khi bạn tổng hợp các yếu tố trong mảng này, các giá trị có thể đạt đến một điểm mà tổng đã trở nên quá lớn rằng việc thêm các yếu tố nhỏ vào khoản tiền này không gây ảnh hưởng, bởi vì sự gia tăng ít hơn có thể được đăng ký như là một sự gia tăng trong việc tổ chức biến tổng.

Giả sử bạn lấy mảng này cùng và sử dụng hai chủ đề để tính toán kết quả. mỗi

Chủ đề tính tổng từng phần hơn một nửa của dãy số. Các chủ đề đầu tiên tính toán tổng của nửa đầu của mảng, trong đó có danh sách các số lượng lớn. Các chủ đề thứ hai sẽ tính toán tổng của nửa thứ hai của mảng, có chứa danh sách của những con số nhỏ. Bây giờ các chủ đề thứ hai sẽ tính một giá trị nhỏ hơn nhiều cho tổng số phần của nó. Khi hai giá trị tích cực nhỏ được thêm vào với nhau, nó có nhiều khả năng là kết quả lớn hơn là lớn nhất trong hai giá trị. Ngược lại, nếu một giá trị nhỏ được thêm vào một giá trị lớn hơn nhiều, có khả năng là kết quả sẽ giống hệt với giá trị lớn hơn. Hậu quả của việc này là các giá trị nhỏ sẽ tích tụ lại và được ghi lại trong tổng tính bằng các sợi thứ hai.

Vào cuối của vùng song song, các giá trị từ cả hai chủ đề được thêm vào để sản xuất

kết quả cuối cùng. Các giá trị mà các sợi thứ hai tính là có khả năng đủ lớn để gây ra một sự thay đổi nhỏ trong giá trị khi thêm vào kết quả lớn từ các chủ đề đầu tiên. Các kết quả trong việc tính toán bằng cách sử dụng hai chủ đề có khả năng là khác nhau từ các kết quả tính toán bằng cách sử dụng chỉ có một sợi. Sự khác biệt có thể chỉ là trong con số đáng kể nhỏ, hoặc thậm chí nó có thể là một sự khác biệt làm tròn. Nhưng, kết quả có tiềm năng có thể khác nhau.

Page 7: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Một số trình biên dịch đặt ra quyết định về việc liệu để thực hiện cắt giảm dưới sự kiểm soát của người sử dụng. Trình biên dịch Solaris Studio yêu cầu người dùng xác định cờ

xreduction parallelize hoạt động giảm. Trình biên dịch Intel không yêu cầu một lá cờ bổ sung để nhận giảm. Chúng ta có thể nhìn thấy kết quả của việc sử dụng lá cờ này trên các mã từ Liệt kê 7.5 ở đầu ra hiển thị trong Liệt 7.12.

Các đầu ra trình biên dịch cho thấy rằng nó công nhận các vòng trong ở dòng 8 và không khai báo nó một phụ thuộc không an toàn. Thay vào đó, vòng lặp được báo cáo là không có lãi để parallelize. Đây là hành vi dự kiến; như chúng ta đã thảo luận trước đây, đó là hiệu quả hơn nhiều để parallelize các vòng ngoài và rời khỏi vòng lặp bên trong như mã nối tiếp.

Giảm được hiện diện ở nhiều mã, và nó thường thích hợp để parallelize họ miễn là các nhà phát triển là nhận thức được rằng điều này có thể gây ra một sự khác biệt trong kết quả tạo ra.

Tự động song song của các Codes Chứa cuộc gọi.

Chúng tôi thảo luận về tác động đến hiệu suất của các cuộc gọi đến các thói quen khác trong Chương 2, "Mã hóa cho hiệu suất." Vấn đề cơ bản với chức năng gọi khác là trình biên dịch không có ý tưởng những gì thông thường mà có thể làm-nó có thể thay đổi dữ liệu toàn cầu hoặc có lẽ không bao giờ quay trở lại. Vì lý do này, một vòng lặp chứa các cuộc gọi chức năng có thể không, nói chung, được tự động song song.

Rõ ràng, sự hạn chế này có thể ngăn cản một số lượng lớn các vòng mà nếu không có thể được song song một cách an toàn. Nơi hiển nhiên nhất, nơi đây sẽ là một vấn đề sẽ được kêu gọi các hàm toán học. Hạn chế này có thể được chứng minh bằng cách sử dụng phiên bản sửa đổi của mã ma trận vector từ Liệt kê 7.9. Listing 7.13 hiển thị mã này được sửa đổi.

Page 8: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Khi biên dịch, các cuộc gọi đến phạm tội () gây ra song song tự động thất bại, như thể hiện trong Liệt kê 7.14.

Trình biên dịch Solaris Studio coi sin () là một "xây dựng trong chức năng", nhưng vì

một nhà phát triển có thể cung cấp một thực hiện thay thế hoặc có thể xen vào các cuộc gọi chức năng, nó không nhận các cuộc gọi trừ khi được bảo làm như vậy. Lá cờ để cho phép nhận được xây dựng trong các chức năng được xbuiltin. Khi cờ này được cung cấp, sản lượng từ các trình biên dịch được hiển thị trong Liệt kê 7.15.

Tuy nhiên, các cuộc gọi đến các hàm toán học chiếm tỷ lệ nhỏ của các cuộc gọi mà

có thể gặp phải trong vòng. Không có cách nào tiêu chuẩn để biểu thị rằng một cuộc gọi đến một chức năng cụ thể được thực hiện một cách an toàn song song, mặc dù các trình biên dịch cá nhân có thể thực hiện các cơ chế có thể được sử dụng. Cách tốt nhất để kích hoạt một vòng lặp có chứa một chức năng gọi để được song song tự động là do nội tuyến chức năng. Nội tuyến thay thế một cuộc gọi đến một hàm với các mã thực tế cho hàm được gọi. Chức năng nội tuyến có thể được kích hoạt với một lá cờ biên dịch nói chung hoặc một lá cờ cho phép một thói quen cụ thể để được inlined. Listing 7.16 cho thấy một biến thể của mã nơi một phần của việc tính toán được thực hiện bởi một thói quen.

Page 9: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Khi mã này được biên dịch, trình biên dịch không tự động parallelize các vòng vì chúng có chứa một cuộc gọi mà có thể không an toàn. Tuy nhiên, khi các mã được biên soạn ở mức độ tối ưu hóa của xO4 hoặc cao hơn, trình biên dịch sẽ tự động thực hiện tối ưu hóa nội tuyến, trong đó loại bỏ các cuộc gọi và cho phép các vòng lặp để được song song. Điều này được thể hiện trong Liệt kê 7.17.

Giúp Compiler trong Tự động parallelizing Mã

Các mã được hiển thị trong Liệt kê 7.18 có một vấn đề răng cưa tiềm năng. Các thay đổi của các yếu tố trong mảng myarray cũng có thể thay đổi các giá trị được trỏ đến bởi chiều dài nếu nó xảy ra là một thành viên của myarray.

Nó có thể thay đổi mã để một trình biên dịch có thể tự động parallelize it.One cách giải quyết này sẽ được chỉ định chiều dài đó là một con trỏ hạn chế trình độ để trình biên dịch sẽ biết rằng các cửa hàng để mảng sẽ không làm thay đổi giá trị trỏ tới theo chiều dài. Một phương pháp khác có thể đặt một giá trị được trỏ đến bởi chiều dài vào một biến tạm thời. Phương pháp thứ hai này có một lợi thế ở chỗ nó không dựa vào sự hỗ trợ cho các từ khóa hạn chế.

Trong nhiều tình huống, trình biên dịch sẽ có thể parallelize vòng nếu một số các vấn đề răng cưa tiềm năng được giải quyết bằng cách sử dụng các biến tạm thời hoặc loại đúc sử dụng con trỏ restrictqualified. Các mã được hiển thị trong Liệt kê 7.19 triển lãm một số vấn đề răng cưa tiềm năng.

Page 10: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Vấn đề đầu tiên là trình biên dịch thấy là nó không nhận ra các vòng lặp ở dòng 10 là một trong đó có thể được song song. Điều này là do thay đổi dữ liệu> array1 có thể thay đổi giá trị của các dữ liệu biến> chiều dài. Vấn đề là trình biên dịch không thể biết bao nhiêu lần lặp của vòng lặp sẽ được thực hiện, do đó, nó không thể phân chia các lần lặp lại giữa nhiều chủ đề. Vấn đề này có thể được giải quyết bằng cách lấy một bản sao của các dữ liệu biến> chiều dài và sử dụng đó như là sự lặp lại giới hạn vòng lặp.

Điều này chuyển đổi các vòng lặp thành một trong đó có thể được công nhận bởi trình biên dịch, nhưng trình biên dịch vẫn không thể parallelize nó bởi vì có răng cưa tiềm năng giữa đọc từ dữ liệu> array2 và ghi dữ liệu> array1. Vấn đề này có thể được giải quyết bằng cách làm cho địa phương hạn chế con trỏ có trình độ mà trỏ đến hai mảng. Listing 7.20 cho thấy nguồn sửa đổi.

Trong một số trường hợp, các trình biên dịch có thể sử dụng versioning của vòng lặp tự động parallelize mã tương tự như trong Liệt kê 7.19. Trình biên dịch tạo ra nhiều phiên bản của vòng lặp, và các phiên bản thích hợp được chọn tại thời gian chạy. Một phiên bản nối tiếp của các vòng lặp được sử dụng khi có răng cưa giữa các cửa hàng để bộ nhớ trong vòng lặp và các biến được sử dụng bởi các vòng lặp. Trong các mã trong Liệt kê 7.19, các cửa hàng dữ liệu> array1 sức bí danh với dữ liệu> array2, dữ liệu> chiều dài, hoặc cấu trúc được trỏ đến bởi dữ liệu. Một phiên bản song song được tạo ra để sử dụng khi không có răng cưa như vậy

Các kỹ thuật để cải thiện các cơ hội mà một trình biên dịch có thể tự động parallelize

một ứng dụng có thể được tóm tắt như sau:

Theo mặc định, hầu hết các trình biên dịch sẽ giả định rằng tất cả các con trỏ có thể bí danh. Điều này có thể được giải quyết bằng cách làm cho các bản sao cục bộ dữ liệu bất biến, bằng cách xác định một aliasing giả định mạnh mẽ hơn, hoặc bằng cách khai báo con trỏ với từ khóa hạn chế

Trình biên dịch có thể yêu cầu thêm cờ cho nó để sản xuất phiên bản song song của tất cả các vòng. Đây có thể là một lá cờ để cho nó cho phép thực hiện song song của các cắt giảm, ví dụ như cờ xreduction cần thiết bởi trình biên dịch Solaris Studio. Ngoài ra, nó có thể là một lá cờ đó làm thay đổi ngưỡng mà các trình biên dịch sẽ xem xét một vòng lặp có lợi nhuận để parallelize. Ví dụ,

Page 11: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

các trình biên dịch Intel có threshold0 cờ mệnh. Cuối cùng, có thể có lá cờ bổ sung cho trình biên dịch để nhận ra các vòng lặp chứa các cuộc gọi đến các chức năng nội tại là an toàn để parallelize; trình biên dịch Solaris Studio đòi hỏi cờ xbuiltin cho mục đích này.

Trình biên dịch không thể parallelize vòng chứa các cuộc gọi đến các chức năng, trừ khi họ chắc chắn rằng các cuộc gọi chức năng là không có tác dụng phụ. Trong một số trường hợp, có thể có chỉ thị biên dịch có thể được đặt vào trong mã nguồn của ứng dụng để cung cấp sự khẳng định này. Trong các trường hợp khác, nó có thể được có thể để buộc các trình biên dịch nội tuyến chức năng, sau đó sẽ kích hoạt nó để parallelize vòng lặp kết quả.

Từ phần này, nó nên được rõ ràng rằng trình biên dịch có thể tự động trích xuất một số song song từ một tập hợp con của các ứng dụng. Kích thước của các tập con có thể được tăng lên bằng cách sử dụng các thông tin phản hồi được cung cấp bởi trình biên dịch và một số kỹ thuật được mô tả ở đây. Tuy nhiên, khả năng của trình biên dịch hiện tại để thực hiện song song tự động bị hạn chế, và một số thay đổi mã nguồn đề xuất ở đây có thể làm giảm độ rõ của các mã nguồn.

Ngoài ra, các API OpenMP cung cấp một cách để lộ song song trong một mã số bằng cách làm thay đổi tối thiểu vào mã nguồn. Với hầu hết các trình biên dịch, nó có thể được sử dụng ngoài việc song song tự động để nhiều ứng dụng có thể được song song.

Sử dụng OpenMP để sản xuất một ứng dụng song song

Với OpenMP, chỉ thị trong các mã nguồn được sử dụng để thể hiện các cấu trúc song song. Những chỉ thị này bắt đầu với cụm từ OMP #pragma. Dưới lá cờ biên soạn phù hợp, chúng được đọc bởi trình biên dịch và được sử dụng để tạo ra một phiên bản song song của các ứng dụng. Nếu cờ biên dịch yêu cầu không được cung cấp, các chỉ thị được bỏ qua. Các đặc điểm kỹ thuật API OpenMP chi tiết các chỉ thị cũng như thư viện cuộc gọi để xác định hoặc sửa đổi các thông số thời gian chạy như số lượng hiện tại của chủ đề. Như chúng ta đã thấy trong Chương 3, "Cơ hội Xác định cho song song," một lợi ích của việc sử dụng các chỉ thị OpenMP là nó tách song song từ các thuật toán. Mã này có thể được đọc mà không cần phải lo lắng về việc làm thế nào song song được thực hiện. Một số ưu điểm khác để sử dụng OpenMPare như sau:

Các chỉ thị chỉ được ghi nhận khi biên dịch với một lá cờ biên dịch đặc biệt, do đó, các cơ sở cùng một nguồn có thể được sử dụng để tạo ra các phiên bản nối tiếp và song song của các mã. Điều này giúp đơn giản hoá gỡ lỗi vì nó là tương đối dễ dàng để xác định xem, cho một vấn đề nhất định, các phiên bản song song tạo ra một câu trả lời khác nhau cho các phiên bản nối tiếp và do đó cho dù một lỗi là vì song song hoặc các thuật toán ban đầu.

Mỗi chỉ được giới hạn trong phạm vi các khu vực của mã mà nó được áp dụng .consequently, các nhà phát triển có thể tập trung vào việc làm cho phần quan trọng của mã song song mà không cần phải được quan tâm về việc thay đổi phần còn lại của các mã để hỗ trợ song song này. Điều này thường được gọi là khả năng thực hiện song song gia tang.

Có lẽ lợi thế lớn nhất là trình biên dịch và thư viện hỗ trợ chịu trách nhiệm cho tất cả các công việc song song và quản lý thời gian chạy của chủ đề.

Nó có lẽ là dễ nhất để chứng minh việc sử dụng OpenMP chỉ thị thông qua các ví dụ đơn giản trong Liệt kê 7.21. Chỉ thị của OpenMP được chỉ định in đậm.

Page 12: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Các mã trong Liệt kê 7.21 cho thấy các chỉ OpenMP có thể được đặt trên các vòng lặp mà nó được áp dụng. Chỉ thị của OpenMP đặt gánh nặng của việc đảm bảo mã là an toàn để thực hiện song song trên các nhà phát triển, không phải trên các trình biên dịch. Mặc dù các trình biên dịch sẽ sản xuất một phiên bản song song của vòng lặp, nó là đến các nhà phát triển để đảm bảo rằng đây là một tối ưu hóa an toàn để thực hiện. Một ví dụ của nơi này có thể không an toàn là nếu hai mảng đã có một số mức độ trùng lắp, sau đó phiên bản song song không thể tạo ra kết quả tương tự như các phiên bản nối tiếp.

Chỉ thị của OpenMP có ba phần:

+ #pragma OMP báo cho trình biên dịch mà một chỉ thị OpenMP những gì sau là.

+ song song cho trình biên dịch để bắt đầu một vùng mới song song. Trừ khi có quy định khác, tất cả các chủ đề sẽ thực thi mã trong khu vực song song.

+ cho cho trình biên dịch rằng tiếp theo cho vòng lặp phải được thực hiện song song.

Nhiều chủ đề sẽ làm việc trên các phần độc lập của một loạt các lần lặp lại. Cuối cùng của vòng lặp, các chủ đề sẽ đợi cho đến khi tất cả các lần lặp lại đã hoàn tất trước khi phần tiếp theo của các mã được thực thi.

Tuyên bố được đưa ra trong đoạn mã này là ví dụ đơn giản nhất có thể, nhưng nó minh họa chính xác những gì các đặc điểm kỹ thuật OpenMP nhằm mục đích để đạt được.

Sử dụng OpenMP parallelize Loops.

OpenMP đặt một số hạn chế đối với các loại vòng mà có thể được song song. Các thư viện runtime cần để có thể xác định điểm bắt đầu và điểm kết thúc cho các công việc được giao cho mỗi thread. Do đó, những hạn chế sau đây là cần thiết:

+ Vòng lặp có phải là một vòng lặp của hình thức này:for (biểu thức init; biểu thức kiểm tra; biểu hiện tăng)

+ Các biến vòng lặp được nhu cầu của một trong các loại sau đây: a dấu hoặc không dấu số nguyên, một con trỏ C, hoặc C ++ ngẫu nhiên iterator truy cập.

+ Các biến vòng lặp cần phải được khởi tạo vào một đầu của dãy.

+ Các biến cần được tăng (hay giảm) bằng một vòng lặp bất biếntăng.

Page 13: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

+ Các biểu thức kiểm tra cần phải được một trong>,> =, <, hoặc <=. Việc so sánh cần được với một giá trị bất biến vòng lặp.

Dưới những điều kiện này, nó có thể cho thời gian chạy để có những vòng lặp và phân chia phạm vi lặp đi lặp lại đến các chủ đề hoàn thành công việc. Vòng mà không tuân thủ các thông số kỹ thuật sẽ cần phải được cơ cấu lại trước khi họ có thể được song song sử dụng song song OpenMP cho xây dựng.

Runtime Hành vi của một ứng dụng OpenMP

OpenMP trình có sử dụng một sự kết hợp của biên dịch hỗ trợ cộng với một thư viện runtime. Biên dịch sử dụng các chỉ thị trong các mã nguồn để sản xuất khối thích hợp codetogether với các cuộc gọi cần thiết vào thư viện runtime.

Ví dụ, khi các trình biên dịch gặp một chỉ định một khu vực song song, trình biên dịch sẽ sản xuất ra một khối mới của mã đó sẽ được thực hiện bởi các chủ đề song song. Các thư viện thời gian chạy là chịu trách nhiệm phân công công việc cho các chủ đề khác nhau.

OpenMP sau một loại mô hình ngã ba-gia. Các thư viện thời gian chạy sẽ tạo ra một đội ngũ các chủ đề. Khi một khu vực song song là gặp phải, công việc sẽ được chia giữa các thành viên của đội bóng này trong bài. Vào cuối của các khu vực, các chủ đề ban đầu, gọi là các sợi tổng thể, sẽ tiếp tục thực hiện các mã sau khi khu vực. Các chủ đề khác, được gọi là đề người lao động, sẽ chờ đợi cho đến khi thread tổng thể đạt đến khu vực tiếp theo song song và làm việc mới được giao cho họ. Số chủ đề sẽ được sử dụng được thiết lập bởi các biến môi trường OMP NUM đề, nhưng điều này có thể được điều chỉnh bởi các ứng dụng trong thời gian chạy bởi các cuộc gọi vào các thư viện hỗ trợ thời gian chạy. Ví dụ, xem xét các mã trong Liệt kê 7.22.

Khi biên dịch và chạy, mỗi chủ đề của số đề theo quy định của OMP NUM đề sẽ thực hiện các khu vực song song. Đối với các trình biên dịch Solaris Studio để nhận các chỉ thị OpenMP, nó cần cờ xopenmp. Lá cờ xloopinfo cho trình biên dịch cung cấp thông tin về song song nó đã được thực hiện. Listing 7.23 cho thấy sản lượng của biên dịch và chạy chương trình này. Mỗi một trong hai chủ đề thực hiện các khu vực song song và in ra đề.

Page 14: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Biến Scoping Bên trong OpenMP Regions Parallel

Một trong những khía cạnh phức tạp của song song là các phạm vi biến được sử dụng trong các khu vực song song. Trong Liệt kê 7.24, có bốn biến được sử dụng trong các khu vực song song: i, chiều dài, array1, array2 và. Các biến có thể được scoped hoặc là chia sẻ, do mỗi thread cổ phiếu cùng một biến, hoặc như tư nhân, trong đó mỗi thread được bản sao của chính nó của biến.

Các vòng lặp phản i cần phải được tư nhân của mỗi chủ đề để mỗi thread được nó bản sao của chính của biến. Các biến array1 và array2 được chia sẻ. mỗi chủ đề hoạt động trên một phạm vi riêng biệt của các giá trị, vì vậy không có chia sẻ dữ liệu thực tế. Chiều dài biến cũng được chia sẻ giữa các chủ đề, nhưng vì nó không được sửa đổi, nó không quan trọng cho dù đó là scoped như chung hoặc riêng. Có thể thấy cách trình biên dịch Solaris Studio đã scoped các biến bằng cách sử dụng công cụ phân tích mã er src vào đối tượng tập tin được tạo ra, như thể hiện trong Liệt kê 7.24.

Các quy tắc về việc Phạm vi biến mặc định trong OpenMP là khá phức tạp. cáctóm tắt đơn giản hóa các quy tắc là họ xác định là biến lặp cảm ứng như làtư nhân, biến được định nghĩa trong mã song song như là tư nhân, và các biến định nghĩa bên ngoài khu vực song song như được chia sẻ. Điều này cần phù hợp trong các tình huống đơn giản nhưng có thể không thích hợp trong những người phức tạp hơn. Trong những tình huống này, nó là tốt hơn để tự xác định Phạm vi biến. Các quy tắc xác định phạm vi mặc định có thể được vô hiệu hóa bằng cách sử dụng mặc định mệnh

Page 15: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

(không có), mà sẽ gây ra các trình biên dịch ra một lỗi cho bất kỳ biến mà xác định phạm vi không được xác định. Các biến có thể được scoped theo ý riêng hoặc chia sẻ bằng cách sử dụng các khoản tư nhân (các biến) hoặc chia sẻ (các biến), tương ứng. Listing 7.25 cho thấy nguồn gốc biến đổi để tự xác định Phạm vi biến.

Giảm parallelizing Sử dụng OpenMP

Không phải tất cả các biến thể được scoped hoặc là chia sẻ hay tư nhân. Ví dụ rõ ràng nhất của một tình huống phức tạp hơn là giảm. Listing 7.26 cho thấy một ví dụ về một giảm. Tổng biến được tính toán bằng cách thêm tất cả các phần tử trong mảng.

Mặc dù các dữ liệu biến được khởi tạo với một trong các giá trị bên ngoài khu vực song song, giá trị này không được thông qua vào các bản sao tin rằng mỗi thread có được bên trong khu vực song song. Do đó, các giá trị được in là không xác định. Để khởi tạo các giá trị của các biến trong khu vực song song với giá trị của nó được tổ chức trước khi khu vực, các biến cần được khai báo sử dụng các khoản firstprivate (biến). Điều này nói với trình biên dịch để bao gồm các mã mà các bản sao giá trị hiện có vào các bản sao tin được tổ chức theo từng chủ đề trong khu vực song song. Listing 7.29 cho thấy mã đổi.

Page 16: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Một trường hợp khác là nơi mà các giá trị của một biến được sử dụng sau khi một khu vực song song. Trong trường hợp này, điều quan trọng là để giữ lại các giá trị đã được ghi vào biến này bởi các thread để thực thi lặp cuối cùng của vòng. Điều này bảo tồn ngữ nghĩa của chương trình nối tiếp. Các khoản cho phép điều này xảy ra là lastprivate (biến). Điều khoản này cũng được hỗ trợ trên các phần song song, mà sẽ được giới thiệu sau. Listing 7.30 cho thấy một ví dụ về cách sử dụng lastprivate để giữ lại giá trị cuối cùng được viết vào biến.

Cải thiện việc phân phối Sử dụng Scheduling

Các lịch trình mặc định cho một song song cho các vòng lặp được gọi là lập lịch tĩnh. Việc lặp đi lặp lại được chia đều, trong khối lặp liên tiếp, giữa các chủ đề. Nếu có hai chủ đề làm việc để hoàn thành 100 lần lặp lại, các chủ đề đầu tiên sẽ hoàn thành 50 lần lặp đầu tiên, và các chủ đề thứ hai sẽ hoàn thành 50 lần lặp lại lần thứ hai. Chương trình này hoạt động tốt trong các tình huống mà mỗi lần lặp mất cùng một lượng thời gian. Tuy nhiên, trong một số trường hợp, một số tiền khác nhau của công việc sẽ được thực hiện trong mỗi lần lặp. Do đó, cả hai chủ đề có thể hoàn thành cùng một số lần lặp lại, nhưng người ta có thể có nhiều việc phải làm trong những lần lặp lại. Listing 7.31 cho thấy một ví dụ về điều này. Số lần lặp lại được thực hiện trong các thói quen calc () phụ thuộc vào các giá trị thông qua vào nó. Các giá trị được chuyển thành thói quen chủ yếu phụ thuộc vào giá trị của biến vòng lặp cảm ứng i. Với lịch trình tĩnh, chủ đề mà có được gán các giá trị cao hơn của tôi sẽ mất nhiều thời gian để hoàn thành work của họ.

Page 17: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Listing 7.32 cho thấy kết quả của việc biên dịch và chạy mã này sử dụng một và hai

đề.

Trong trường hợp này, đi từ một đến hai đề giảm thời gian chạy từ khoảng 5 giây đến 3,5 giây. Điều này là ít hơn so với mở rộng quy mô tuyến tính. Lý tưởng nhất, tăng gấp đôi số lượng thread nên giảm một nửa thời gian chạy. Lý do cho việc mở rộng quy mô nghèo này là công việc được phân bố không đều giữa hai chủ đề. Các chủ đề đó sẽ tính toán các kết quả forthe giá trị thấp hơn của tôi sẽ có ít lặp đi lặp lại để hoàn thành trong thread thanthe vòng trong cùng là tính toán giá trị cao hơn của tôi.

Chúng tôi có thể giải quyết điều này bằng cách thay đổi lịch trình của các vòng lặp. Thay vì có một tĩnh lịch trình, chúng ta có thể sử dụng một lịch trình năng động. Một lịch trình năng động có

Page 18: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

nghĩa rằng công việc được chia thành nhiều khối của công trình. Như mỗi thread hoàn thành một đoạn của công việc, phải mất đoạn tiếp theo của công việc. Điều này đảm bảo rằng một chủ đề mà hoàn thành công việc của mình nhanh hơn kết thúc lên làm nhiều khối, trong khi một sợi mà mất rất nhiều thời gian để hoàn thành từng đoạn của công việc sẽ kết thúc hoàn thành ít trong số họ. Năng động, lập lịch trình được lựa chọn bằng cách sử dụng lịch trình quy định tại khoản (năng động). Listing 7.33 cho thấy mã đổi.

Chạy mã này được sửa đổi về kết quả nền tảng tương tự trong một thời gian chạy của 2,5 giâymột nửa đơn luồng runtime gốc.

Năng động, lập kế hoạch tránh các vấn đề về phân phối các công việc đồng đều giữa các chủ đề.

Tuy nhiên, nó cũng phải gánh chịu các chi phí thời gian chạy hơn. Đây không phải là rất rõ ràng trong ví dụ nhỏ này. Thay vì sử dụng một chuỗi mã để chứng minh nó, nó là tương đối đơn giản để giải thích lý do cho sự gia tăng trong chi phí.

Với lịch trình tĩnh, các chủ đề được giới hạn lặp lại của họ khi họ bắt đầu, và một lần hoàn thành, họ có thể chờ đợi ở một rào cản cho đến khi tất cả các chủ đề khác đã hoàn thành. Không có đồng bộ hóa giữa các chủ đề trong khu vực song song.Ngược lại, lịch trình năng động yêu cầu mỗi chủ đề hoàn thành một đơn vị làm việc đó là ngắn hơn nhiều so với những chia sẻ của tổng số lần lặp. Mỗi lần một sợi hoàn thành đoạn ngắn này của công việc, nó phải lấy các đoạn tiếp theo. Mỗi lấy của một đoạn của công việc là một điểm serialization tiềm năng, bởi vì tất cả các chủ đề phải hợp tác để xác định những người được đoạn tiếp theo. Vì vậy, sự gia tăng chi phí xuất phát từ hai yếu tố tiềm năng: số nơi một đoạn mới của công việc là chi phí truyền thông lấy và theinterthread khi mỗi đoạn làm việc mới được lấy.

Page 19: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Kích thước mặc định của các khối cho một lịch trình năng động là một. Mỗi thread thực hiện một sự lặp lại duy nhất trước khi trở lại làm việc nhiều hơn. Điều này có thể là quá thấp giá trị, kết quả trên không đồng bộ đáng kể. Một tham số bổ sung có thể được trao cho các khoản lịch phối các kích thước đoạn sử dụng. Tham số này có thể là một giá trị tĩnh hoặc có thể được tính tại thời gian chạy. Listing 7.34 cho thấy một ví dụ về sử dụng lập lịch năng động với một giá trị kích thước chunk tính tại thời gian chạy

Một chế độ lập lịch trình được hướng dẫn. Với lịch trình hướng dẫn, kích thước của các đoạn công việc được giao là tỷ lệ thuận với số lượng công việc còn lại. Vì vậy, ban đầu các chủ đề sẽ được giao khối lượng công việc lớn, nhưng sau đó họ sẽ nhận được những phần nhỏ hơn cho đến khi tất cả các công việc được hoàn thành. Lập kế hoạch hướng dẫn cũng có thể lấy một tham số tùy chọn để xác định kích thước đoạn nhỏ nhất được sử dụng. Kích thước đoạn tối thiểu mặc định là một sự lặp lại duy nhất. Bảng liệt kê 7,35 cho thấy một ví dụ về lập kế hoạch hướng dẫn.

Có hơn hai chế độ lập lịch trình: tự động và thời gian chạy. Lịch trình (tự động)khoản sẽ để lại các quyết định lập kế hoạch cho các hệ thống thời gian chạy để xác định automati-biệt. Mệnh đề lịch (runtime) cho phép các môi trường OMP biến SCHEDULE để xác định loại của lịch sử.

Lập lịch tĩnh cũng có thể lấy một tham số kích thước đoạn tùy chọn. Nếu kích thước chunk được quy định cho việc lập lịch tĩnh, công việc được phân chia thành các đơn vị tương đương kích thước chunk định. Chúng được phân phối round-robin với đề người lao động. Điều này có nghĩa rằng một số đề người lao động không có công việc được giao cho họ hoặc được rằng một số chủ đề kết thúc với nhiều khối công việc hơn những người khác. Trong trường hợp không có một kích thước chunk quy định, công việc được chia đều trên tất cả các chủ đề.

Sử dụng Phần Parallel để Thực hiện làm việc độc lập

Page 20: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

OpenMP phần song song cung cấp một cách khác để parallelize mã thành nhiều đơn vị độc lập với việc có thể được giao cho chủ đề khác nhau. Phần song song cho phépcác nhà phát triển để gán các phần khác nhau của mã đề khác nhau. Hãy xem xét một tình huống mà trong quá trình đang được khởi tạo một ứng dụng cần thiết lập hai danh sách liên kết. Listing 7.36 cho thấy một ví dụ.

Các khu vực được giới thiệu song song bằng cách sử dụng chỉ thị # pragma OMP song song. Trong này

Ví dụ, nó được kết hợp với các chỉ thị phần để sản xuất ra một tuyên bố đơn. Điều này xác định các khu vực của mã như có chứa một hoặc nhiều phần của mã mà có thể được thực hiện song song. Mỗi phần cá nhân được xác định bằng cách sử dụng ompsection chỉ thị # pragma. Điều quan trọng để nhận thấy các dấu ngoặc mở và gần gũi mà biểu thị ofcode phạm vi bao gồm trong các phần song song và cũng biểu thị các mã trong mỗi song song section.In sự vắng mặt của niềng răng là, phần song song sẽ chỉ áp dụng đối với các mã lineof sau.

Tất cả các chủ đề chờ đợi ở cuối khu vực phần song song cho đến khi tất cả các công việc đã được hoàn thành, trước khi bất kỳ mã tiếp theo được thực thi.

Page 21: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Mặc dù phần song song tăng phạm vi của các ứng dụng mà có thể được song song sử dụng OpenMP, nó có những hạn chế mà các xử lý song song là tĩnh định nghĩa trong mã nguồn. Định nghĩa tĩnh này song song hạn chế mức độ rộng có thể được dự kiến từ ứng dụng. Phần song song thực sự hiệu quả chỉ trong tình huống mà ở đó là một hạn chế, cơ hội tĩnh để xử lý song song. Trong hầu hết các trường hợp khác, nhiệm vụ song song, mà chúng ta sẽ thảo luận sau đó, có thể là một giải pháp tốt hơn.

Parallelism nested

Các OpenMP API cũng hỗ trợ xử lý song song lồng nhau. Ở đây, một khu vực song song là gặp phải bên trong một khu vực song song. Đây có thể là một cách hữu hiệu để đạt được tăng parallelismby có nhiệm vụ hoặc các phần song song cung cấp nhiên bằng hạt song song và sau đó sử dụng một song song để dành đạt được song song hơn nữa trong nhiệm vụ hoặc khu vực. Nestedparallelism cũng rất hữu ích trong các tình huống mà các thuật toán đệ quy là trong tự nhiên.

Listing 7.37 cho thấy một ví dụ về xử lý song song lồng nhau nơi hai phần song song chứa song song cho rằng chỉ thị khởi tạo hai mảng các giá trị. Hỗ trợ xử lý song song lồng nhau có thể được kích hoạt thông qua các biến môi trường OMP lồng nhau hoặc thông qua một cuộc gọi đến bộ OMP thường lồng vào nhau () với một giá trị khác hơn không. Tuy nhiên, sự hỗ trợ của OMP bộ lồng vào nhau () là tùy chọn. Nó có thể được xác định liệu song song lồng nhau được kích hoạt hay không thông qua một cuộc gọi đến OMP được lồng vào nhau ()

Page 22: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Tuy nhiên, song song lồng nhau rất phức tạp, do đó, cuộc thảo luận chi tiết được trái với các văn bản chuyên về chủ đề của OpenMP.

Sử dụng OpenMP cho động xác định nhiệm vụ song song

Các đặc điểm kỹ thuật OpenMP 3,0 giới thiệu nhiệm vụ. Một nhiệm vụ là một khối mã đó sẽ được

thực hiện tại một số điểm trong tương lai bằng một trong những đội bóng của chủ đề. Mỗi lần chỉ thị nhiệm vụ là gặp phải trong thời gian chạy, một nhiệm vụ mới được tạo ra và thêm vào danh sách các công việc hy vọng sẽ hoàn thành. Cơ sở này cho phép OpenMP để giải quyết nhiều vấn đề mà trước đây chỉ có thể được giải quyết bằng cách sử dụng thanh lịch đề. Như một ví dụ, nó có thể towrite một phiên bản của máy chủ tiếng vọng từ Chương 5, "Sử dụng POSIX Threads," sử dụng nhiệm vụ OpenMP. Ví dụ này kết hợp song song giữa các vòng, phần song song, và song song lồng nhau, cùng với ứng dụng tasks.The song song sử dụng các phần song song để bắt đầu cả một khách hàng và một sợi lái xe.

Listing 7.38 cho thấy mã nguồn để làm điều này. Code này sử dụng song song lồng nhau, vì vậy điều này cần phải được kích hoạt một cách rõ ràng bằng cách gọi OMP bộ lồng vào nhau () với một giá trị khác. Phần song song rõ ràng yêu cầu hai chủ đề bằng cách sử dụng các chủ đề num (2) khoản. Lưu ý rằng để thực hiện chính xác, mã dựa trên việc có ít nhất hai CPU ảo. Nếu đang chạy trên một hệ thống chỉ với một CPU ảo duy nhất, mã sẽ không hoạt động chính xác bởi vì nó sẽ bị trì hoãn trong khi thực hiện các echothread () mã và sẽ không bao giờ có được để thực hiện các driverthread ().

Page 23: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Listing 7.39 cho thấy mã cho các lái xe hoặc khách hàng là một phần của ứng dụng. Đây codeuses một song song cho các vòng lặp trong mã điều khiển để khởi động nhiều yêu cầu đến máy song song. Các mã điều khiển chia sẻ một sockaddr duy nhất trong cấu trúc giữa tất cả các chủ đề. Mỗi thread được một bản sao riêng của s biến, mà giữ ID của socket là đề tài đã mở ra cho các máy chủ. Mỗi lần lặp của vòng lặp sẽ gửi một chuỗi các máy chủ và sau đó chờ đợi phản ứng của nó.

Page 24: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Listing 7.40 cho thấy mã máy chủ. Này có một kết nối đến và ra mắt một nhiệm vụ mới để xử lý mà kết nối đến.

Page 25: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Mã này sử dụng ba chỉ OpenMP. Chúng tôi đã gặp OMP song song

chỉ thị, mà là bắt đầu của một khu vực song song, nhưng không phải chỉ đơn OMP,mà nói với trình biên dịch mà chỉ có một thread là để thực thi mã kèm theo. Như đã thảo luận trước đó, tất cả các chủ đề sẽ thực thi mã trong khu vực song song theo mặc định. Chủ đề duy nhất này là trách nhiệm chấp nhận các kết nối gửi đến và sau đó sản xuất các nhiệm vụ mới, xử lý các chi tiết của kết nối.

Cuối cùng, chỉ thị nhiệm vụ OMP bao quanh khu vực của mã đó là để được thực thi như là nhiệm vụ. Dòng suối biến được scoped như firstprivate theo mặc định, vì vậy mỗi công việc được một bản sao riêng của biến. Trong công việc, biến này được gán giá trị mà nó nắm giữ tại thời điểm

Page 26: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

đó các nhiệm vụ đã được tạo ra. Nhiệm vụ mới sau đó xử lý sau vọng lại của dữ liệu được gửi vào đó ổ cắm riêng.

Listing 7.41 cho thấy kết quả của việc biên dịch và chạy mã này vào một chiều bốnmáy. Các ứng dụng kết quả cần phải được liên kết với các thư viện socket (lsocket) và thư viện các dịch vụ mạng (lnsl). Điều quan trọng để quan sát là các bài gửi và nhận các thay đổi ổ cắm, chỉ ra rằng công việc đang được phân phối trên tất cả các chủ đề có sẵn.

Giữ dữ liệu riêng cho Chủ đề

Có thể thiết lập dữ liệu thread-địa phương sử dụng các chỉ thị threadprivate OpenMP.Chỉ thị này làm việc trong một cách tương tự như tờ khai chủ đề, mô tả trong Chương 5, trong việc đưa ra mỗi thread giữ một bản sao riêng của một số biến. Listing 7.42 cho thấy một ví dụ về khai báo một biến threadprivate.

Các giá trị của biến threadprivate có thể tồn tại song song giữa các vùng. Cácquy định điều chỉnh khi điều này sẽ xảy ra là hơi phức tạp nhưng có thể được tóm tắt như

yêu cầu rằng số chủ đề đang hoạt động là như nhau cho hai khu vực song song.Có những hạn chế khác về các biến threadprivate. Nếu mã này song songsử dụng các nhiệm vụ và các giá trị

Page 27: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

của biến phụ thuộc vào thứ tự mà các nhiệm vụ được hoàn thành, sau đó giá trị của nó sẽ không thể đoán trước.

Trong phần nối tiếp của trình thực thi của ứng dụng, các biến sẽ trở lại giá trịtổ chức bởi các chủ đề chủ. Điều này có thể được chứng minh bằng cách sử dụng mã được hiển thị trong Liệt kê 7.43.The biến i là sợi nhân. Trong thread tổng thể, nó được thiết lập để giữ giá trị -1, nhưng khu vực trên cả chặng đường song song, nó được thiết lập để giữ thread ID. Mỗi chủ đề sẽ thiết lập giá trị của i cho ID chủ đề của nó. ID của thread tổng là số không. Bên ngoài khu vực song song, các tham chiếu đến các biến i giải quyết để các giá trị được tổ chức bởi các chủ đề chủ. Vì vậy, phiên bản cuối cùng của biến i sẽ bằng không.

Lý do chính để sử dụng các biến threadprivate là để giữ một giá trị trong một khu vực song song, không nhất thiết phải qua vùng song song. Do đó, có thể có các yêu cầu để sao chép một giá trị vào một khu vực. Các bản mệnh copyin giá trị từ các sợi tổng thành các giá trị threadprivate tổ chức bởi các đề người lao động. Điều khoản này có thể được đặt trên các vùng song song. Listing 7.44 cho thấy một ví dụ về cách sử dụng mệnh đề copyin. Các giá trị của biến i trong khu vực song song sẽ là -1 cho chủ đề.

Page 28: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Chỉ thị copyprivate có thể được sử dụng để truyền bá các giá trị của một threadprivate biến tính trong một khu vực duy nhất cho tất cả các chủ đề. Mặc dù điều này áp dụng cho các singledirective, tác động của mệnh đề là ở phần cuối của khu vực duy nhất mà giá trị được sao chép từ các chủ đề duy nhất cho tất cả các chủ đề khác. Điều này có thể được sử dụng cho việc khởi tạo các biến threadprivate hoặc sự phổ biến của một giá trị mới cho tất cả threads.Listing 7.45 cho thấy một ví dụ về cách sử dụng copyprivate. Trong ví dụ này, chủ đề sẽ nhận được giá trị 2 cho bản tin của họ biến i.

Kiểm soát Runtime Environment OpenMP

Các môi trường runtime OpenMP có thể được kiểm soát trong lên đến ba cách khác nhau. Chúng ta đã gặp các biến môi trường OMP NUM đề để thiết lập số lượng các chủ đề mà chương trình sử dụng. Tuy nhiên, nó cũng có thể thiết lập này thông qua các cuộc gọi chương trình đối với các thư viện thời gian chạy hoặc thậm chí là các khoản đặt vào các chỉ thị trong mã nguồn. Khoản sẽ ghi đè lên các thiết lập từ các cuộc gọi đến các chức năng API, và những willoverride bất kỳ cài đặt

Page 29: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

môi trường. Phần này thảo luận về các thiết lập khác nhau có thể được cấu hình và các tùy chọn có sẵn cho cấu hình chúng.

Thiết lập Số chủ đề

Như đã thấy trước đây, số lượng các chủ đề được sử dụng bởi một ứng dụng OpenMP có thể được thiết lập thông qua môi trường biến OMP NUM đề. Nó cũng có thể thiết lập số lượng các chủ đề bằng cách sử dụng chức năng gọi OMP thiết đề num (), như thể hiện trong Liệt kê 7.46.Calls để OMP thiết đề num () thay đổi giá trị mặc định cho tất cả các vùng song song tiếp theo. Nó có thể xác định số lượng các đề bằng cách sử dụng chức năng gọi OMP được đề max (). Các chức năng gọi OMP get đề num () sẽ trả về một ID duy nhất cho mỗi chủ đề.

Số chủ đề cho một khu vực song song có thể được quy định trong các chủ đề (chủ đề) khoản mã nguồn usingthe num. Các giá trị cho số lượng các chủ đề có thể được cố định, hoặc nó có thể là một số nguyên tính toán dựa trên một số yếu tố khác. Listing 7.47 cho thấy một ví dụ về cách sử dụng một giá trị cố định cho việc này.

Page 30: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Mệnh đề num sẽ ghi đè lên các giá trị mặc định chỉ cho song song single này

khu vực. Các khu vực song song tới sẽ lại lấy giá trị mặc định cho số lượng

đề, trừ khi điều này cũng có một khoản đề num.

Có một biến môi trường khác có thể thiết lập số lượng các chủ đề. OMP THREAD LIMIT đặt số tối đa của chủ đề được cho phép. Đó là một thực hiện quy định về việc giới hạn này sẽ được áp dụng trên tất cả các nỗ lực để sử dụng đề hơn giới hạn này. Các giá trị cho giới hạn này có thể thu được thông qua các chủ đề giới hạn OMP get chức năng gọi ().

An thực hiện OpenMP có thể tôn vinh các biến môi trường OMP NĂNG ĐỘNG.

Biến môi trường này có thể được thiết lập hoặc là đúng hoặc sai. Nếu nó được thiết lập là true, sau đó thực hiện OpenMP có thể phản ứng với các điều kiện và thời gian chạy sử dụng đề ít hơn so với yêu cầu cho bất kỳ khu vực song song. Biến này có thể được thiết lập trong thời gian chạy với một cuộc gọi đến OMP thiết lập năng động (), và giá trị của nó có thể được đọc bởi một cuộc gọi đến OMP có được năng động ().

Thiết Scheduling Runtime Vòng

Việc lập kế hoạch cho vòng với mệnh lịch trình thời gian chạy được kiểm soát với các biến môi trường OMP LỊCH. Các lịch trình cũng có thể được thiết lập trong thời gian chạy thông qua một cuộc gọi đến OMP bộ lịch trình (), và các lịch trình hiện tại có thể thu được thông qua một cuộc gọi đến OMP có được lịch trình (). Các chức năng cuộc gọi để có được và thiết lập lịch trình nhận hai tham số. Đầu tiên là một số nguyên cho biết lịch trình yêu cầu. Thứ hai là kích thước đoạn (tham số thứ hai sẽ được bỏ qua cho lịch trình mà không yêu cầu một kích thước chunk). Các lịch trình có sẵn được OMP sched tĩnh, OMP sched năng động, OMP sched hướng dẫn, và OMP sched tự động. Listing 7.48 chứng minh bằng cách sử dụng các cuộc gọi để có được và thiết lập lịch trình.

Xác định Kích Stack cho Worker Threads

Kích thước ngăn xếp của các chủ đề tổng thể được thiết lập thông qua các môi trường hệ điều hành bình thường. Điều này có thể được thay đổi bằng cách sử dụng lệnh ulimit trên nền tảng UNIX-like. Trên Windows, mặc định kích thước ngăn xếp được thiết lập tại thời gian liên kết.

Kích thước mặc định ngăn xếp cho mỗi sợi nhân tạo ra bởi thời gian chạy thư viện của OpenMP thực hiện cụ thể. Tùy thuộc vào yêu cầu ngăn xếp không gian, điều này efaultmay không

Page 31: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

đủ. Các biến môi trường OMP STACKSIZE xác định ngăn xếp không gian cho các đề người lao động. Không có cuộc gọi vào các thư viện runtime mà bộ kích thước này.

Các biến môi trường có một số với một hậu tố bắt buộc. Một số không có hậu tố được coi là là kilobyte, hậu tố B chỉ ra rằng số lượng là byte, hậu tố K chỉ ra rằng nó là kilobyte, hậu tố M được diễn giải theo megabyte, và hậu tố G chỉ gigabyte.

Đang chờ làm việc để hoàn thành

Đối với hầu hết các cấu trúc song song, có một rào cản tiềm ẩn ở cuối để đảm bảo rằng tất cả các chủ đề hoàn thành công việc của mình trước khi khối mã tiếp theo được bắt đầu. Phần này mô tả các tùy chọn trong OpenMP cho việc thay đổi hành vi mặc định rào cản.

Cho phép Chủ đề Tiếp tục để Execution Ngoài một Region Parallel

Mệnh đề nowait áp dụng song song với, phần song song, và chỉ duy nhất. Tất cả những chỉ thị có một ngụ ý chờ đợi ở cuối khu vực song song. Sử dụng các chỉ thị có nghĩa là các chủ đề trong khu vực song song sẽ tiếp tục vào vùng mã tiếp theo sau khi họ đã hoàn thành một hiện tại mà không cần chờ đợi cho các đề người lao động khác để hoàn thành công việc của họ. Listing 7.49 chứa một ví dụ về hai cho rằng vòng lặp qua hai dãy khác nhau trên hai bộ khác nhau của các biến. Một khi các chủ đề đã hoàn thành các vòng lặp đầu tiên, không có lý do tại sao họ không nên bắt đầu làm việc vào vòng thứ hai. Tùy chọn này có thể được biểu thị bằng cách dán nhãn các vòng đầu tiên với các khoản nowait. Phần thứ hai giữ khoản chờ đợi tiềm ẩn, vì vậy thực hiện sẽ không được tiếp tục cho đến khi tất cả các chủ đề hoàn thành công việc của họ vào vòng thứ hai.

Chủ đề Gây để đợi đến khi tất cả các chủ đề đã hoàn thành công việc của họ Chỉ thị rào cản đặt một rào cản rõ ràng trong một khu vực song song. Trong Liệt kê 7.50, chỉ thị hàng rào được sử dụng với chỉ thị tổng thể để đảm bảo rằng tất cả các chủ đề chờ đợi trong khi thread tổng thể hoàn thành nhiệm vụ của mình. Các chỉ thị tổng thể không có một điều khoản chờ đợi tiềm ẩn, vì vậy mà không chỉ hàng rào, các sợi đơn có thể in sản lượng của nó trước khi phân master. Với rào cản ở nơi này, các mã sẽ luôn luôn in ra chuỗi "Master thread" trước khi nó in ra chuỗi "Single thread".

Page 32: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Đang chờ All Tasks Child để hoàn thành Khi một ứng dụng đã được sử dụng song song nhiệm vụ, nó có thể hữu ích để chờ đợi cho tất cả các nhiệm vụ trẻ em hiện nay từ một vùng song song để hoàn thành trước khi tiếp tục thực hiện. Chỉ thị taskwait đảm bảo rằng điều kiện này được đáp ứng. Hãy xem xét các mã được hiển thị trong Liệt kê 7.51

Page 33: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Trong ví dụ này, chỉ thị taskwait được sử dụng để đảm bảo rằng các công việc con hoàn chỉnh trước khi nhiệm vụ phụ huynh thực hiện công việc của mình, đó là in ấn các giá trị của biến i. Trong trường hợp không có chỉ thị taskwait, nó sẽ có thể cho các nhiệm vụ phụ huynh để in sản lượng của nó trước các nhiệm vụ con in của họ. Listing 7.52 cho thấy đầu ra từ ứng dụng này.

Hạn chế việc Threads Đó Thực hiện một Vùng Mã

Có những tình huống mà nó là cần thiết để hạn chế số lượng các chủ đề có thể thực thi một khối mã. Ví dụ, có thể có lý do thuật toán mà chỉ có một chủ đề duy nhất nên thực hiện một vùng mã. Ngoài ra, cho đúng đắn, nó có thể là cần thiết để đảm bảo rằng chỉ một chủ đề duy nhất tại một thời điểm thực thi một vùng mã. nó cũng có thể là cần thiết để hạn chế số lượng các đề thi một khu vực song song nếu không có đủ công việc cho chủ đề hơn để hoàn thành. Phần này mô tả nhiều cách mà số lượng các chủ đề có thể được hạn chế.

Thực hiện một Vùng Mã Sử dụng một đề tài Độc thân

Chúng tôi gặp nhau chỉ thị duy nhất trong phần "Sử dụng OpenMP cho động Defined Nhiệm vụ song song. "Chỉ thị duy nhất xác định rằng chỉ có một chủ đề sẽ thực thi mã trong khu vực. Tất cả các chủ đề khác sẽ đợi cho mã này sẽ được thực hiện trước khi tiếp tục. Mệnh đề nowait có thể được sử dụng nếu các chủ đề khác nên tiếp tục thực hiện trước khi các chủ đề duy nhất hoàn thành thực hiện. Đối với một ví dụ về các chỉ thị đơn, xem Liệt 7.40..

Cho phép Chỉ Thầy chủ đề đến Thực hiện một Vùng Mã

Chỉ thị của tổng thể là tương tự như các chỉ thị duy nhất ở chỗ nó chỉ xác định một Chủ đề cần thực hiện các khu vực kèm theo. Có hai sự khác biệt giữa các chỉ thị. Đầu tiên là nó xác định rằng các chủ đề tổng thể là một trong đó sẽ làm công việc; các chỉ thị duy nhất không xác định chủ đề sẽ thực hiện công việc. Sự khác biệt thứ hai là các chỉ thị tổng thể không gây ra các chủ đề khác để chờ đợi cho công việc trong khu vực sẽ được hoàn thành trước khi tiếp tục.

Chỉ thị của thầy rất hữu ích trong các tình huống mà chỉ có một thread cần để hoàn thành công việc. Nó đảm bảo rằng cùng một chủ đề luôn luôn thực hiện các khu vực của mã, vì vậy bất kỳ biến thread-địa phương sẽ mang theo hơn từ hành trước đó. Điều này có thể hữu ích cho việc phát sóng và chia sẻ các giá trị của các biến giữa các chủ đề. Một ví dụ về các chỉ thị tổng thể có thể được nhìn thấy trong Ví dụ 7.50.

Hạn chế Thi hành một Vùng Mã để một chủ đề đơn

Page 34: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Cho đúng đắn, đôi khi nó là cần thiết để hạn chế một vùng mã để nó chỉ được thực hiện bởi một chủ đề duy nhất tại một thời điểm. Điều này có thể đạt được bằng cách sử dụng chỉ thị quan trọng. Listing 7.53 cho thấy một cách rất hiệu quả của việc thực hiện giảm bằng cách sử dụng một chỉ thị quan trọng để đảm bảo rằng chỉ có một sợi thay đổi biến giảm bất cứ lúc nào.

Các chỉ thị quan trọng có một tên tùy chọn. Điều này cho phép các phần quan trọng cùng để bảo vệ nhiều vùng mã. Ví dụ, tất cả các truy cập đến tổng số biến có thể được bảo vệ bởi một phần quan trọng của tên tổng phần quan trọng, như thể hiện trong Ví dụ 7.54.

Thực hiện các hoạt động nguyên tử

Đôi khi, tất cả những gì cần thiết là những thay đổi nguyên tử của một biến. OpenMP hỗ trợ này thông qua các chỉ thị nguyên tử mà chỉ áp dụng đối với việc sửa đổi sau đây của một biến. Listing 7.55 cho thấy cách giảm có thể được mã hóa bằng cách sử dụng một chỉ thị nguyên tử. Chỉ thị của nguyên tử đảm bảo chính xác hành vi nhưng có thể không có bất kỳ nhanh hơn bằng cách sử dụng một phần quan trọng.

Sử dụng Locks Mutex

Page 35: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

OpenMP cũng hỗ trợ các tính linh hoạt được cung cấp bởi ổ khóa mutex, được hỗ trợ thông qua các khóa OpenMP. Một khóa được công bố là loại OMP khóa t và khởi tạo thông qua một cuộc gọi đến khóa OMP init (). Các khóa bị phá hủy với một cuộc gọi đến OMP tiêu diệt lock (). Để có được các khóa, các mã gọi thiết lập khóa OMP (), và để phát hành các khóa, các cuộc gọi đang OMP khóa unset (). Mã này có thể kiểm tra xem khóa có sẵn bằng cách gọi khóa kiểm tra OMP (). Có thể viết lại mã giảm sử dụng OpenMP ổ khóa, như thể hiện trong Liệt kê 7.56.

Có điều kiện tiếp Serial Thực hiện Regions Parallel

Trong một số trường hợp, nó có thể hữu ích để xác định các điều kiện khi một khu vực song song phải được thực hiện bởi một chủ đề duy nhất. Điều này tiết kiệm phải đặt cả hai phiên bản nối tiếp và một phiên bản song song của các khối mã trong mã nguồn của ứng dụng.

Nhân dịp rõ ràng nhất để làm điều này sẽ là khi không có đủ công việc để biện minh cho việc sử dụng nhiều hơn một thread. Mệnh đề if () có thể được áp dụng cho một chỉ thị song song để xác định các điều kiện, khi vùng này nên được thực hiện trong parallel.Listing 7.57 cho thấy một ví dụ về cách sử dụng chỉ thị này. Các mã này sẽ thực hiện các khu vực sử dụng nhiều chủ đề chỉ nếu chiều dài biến có giá trị lớn hơn 1000.

Page 36: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Một sử dụng cho các khoản nếu () sẽ là trong tình huống mà sử dụng nhiều chủ đềđể thực thi một khu vực của đoạn mã sẽ gây ra các vấn đề đúng đắn. Ví dụ, nếu một vòng lặp tính toán một số chức năng của hai vectơ, mã đôi khi được gọi với vector có bí danh. Mệnh đề if () có thể được sử dụng để kiểm tra xem các bí danh vectơ và thực thi mã song song chỉ khi không có răng cưa là hiện tại.

Đảm bảo luật đó trong một khu vực có phải là song song

Thực hiện theo thứ tự

Trong một số trường hợp, nó có thể là cần thiết để đảm bảo rằng một phần của mã được thực thi theo thứ tự giống như mã số serial sẽ thực hiện nó. Thật không may, như một sắp đặt có vẻ không cho phép mã để có được lợi ích đầy đủ của việc sử dụng nhiều chủ đề, nhưng nó phải cho phép một số lợi ích có được đạt từ song song.

OpenMP hỗ trợ các chỉ thị ra lệnh, trong đó đảm bảo rằng trình tự thực hiện song song cũng giống như thứ tự nối tiếp. Các chỉ thị cần phải được áp dụng cho các khu vực song song, và các vòng lặp cũng cần phải được xác định là một vòng lặp ra lệnh sử dụng mệnh lệnh trên song song cho chỉ thị. Listing 7.58 cho thấy cách ra lệnh thảm khốc.

Các chỉ thị ra lệnh là hữu ích nhất khi áp dụng cho vòng mà không sử dụng tĩnh lập lịch trình. Với lịch trình tĩnh mặc định được sử dụng trong ví dụ này, chủ đề đầu tiên sẽ thực hiện phần đầu của các lần lặp lại, các chủ đề thứ hai của phần thứ hai, và như vậy. Kể từ khi khu vực đặt hàng cần được thực hiện theo thứ tự nối tiếp, trình thứ hai kết thúc chờ đợi ở các khối mã lệnh cho đến khi thread

Page 37: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

đầu tiên đã hoàn thành tất cả các công việc được giao. Điều này có nghĩa rằng công việc được đăng, nhưng mỗi đoạn nối tiếp công việc đã được thực hiện bởi một chủ đề khác nhau.

Các chỉ thị ra lệnh là một cách hữu hiệu để khám phá tác động của việc lập lịch trên thứ tự mà lặp đi lặp lại được giao cho chủ đề. Listing 7.59 cho thấy mã sửa đổi để sử dụng lập lịch năng động.

Listing 7.60 cho thấy ảnh hưởng của sự thay đổi này trong lịch trình. Năng động, lập kế hoạch gây ra hai chủ đề để làm việc với các kích thước đoạn mặc định của một sự lặp lại duy nhất, do đó, hai chủ đề luân phiên thực hiện lặp đi lặp lại

Sụp đổ lề để cải thiện Workload Balance

The song song với chỉ thị chỉ áp dụng cho các vòng tiếp theo. Như mọi khi, nó là tốt nhất để áp dụng song song ở vòng ngoài cùng, vì điều này làm giảm số lượng đồng bộ cần thiết. Tuy nhiên, một chuyến đi thấp đếm cho các vòng ngoài sẽ hạn chế số lượng tối đa của chủ đề mà có thể được sử dụng song song. Trong những trường hợp này, nó có thể thích hợp để parallelize các vòng trong, vì điều này có thể có một số lần lặp lại cao hơn. Mà không biết đếm chuyến đi cho hai vòng, nó không thể quyết định những chiến lược thích hợp hơn.

Tuy nhiên, OpenMP cung cấp một cách để tránh các vấn đề với các vòng ngoài cùng có một số chuyến đi thấp, mà là để thu gọn vòng bên trong và bên ngoài thành một tuyến duy nhất. Mệnh đề để làm điều này là sự sụp đổ, trong đó có số vòng lặp để sụp đổ như một tham số. Listing 7.61 lãm một ví dụ về một mã nơi các vòng ngoài có một số chuyến đi thấp, và sử dụng các khoản sụp đổ phép nhân rộng đến con số cao hơn của chủ đề.

Page 38: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Nếu không có mệnh đề sụp đổ, vòng ngoài cùng sẽ chỉ bao giờ có quy mô đến hai chủ đề. Với mệnh đề sụp đổ, vòng lặp kết hợp có thể lên đến một lý thuyết 20.000 bài (mặc dù các chi phí đồng bộ hóa sẽ gây ra các mã để chạy từ từ xa trước khi đếm mà đã đạt được). Sử dụng mệnh đề sụp đổ có thể giới thiệu thêm overhead vào khu vực song song, do đó, nó là giá trị đánh giá xem các điều khoản sẽ cải thiện hiệu suất hoặc gây ra một sự mất mát hiệu suất.

Thi hành Memory Tính nhất quán

Thống nhất bộ nhớ là khi các giá trị tổ chức trong sổ đăng ký bởi một sợi phù hợp với những tổ chức trong bộ nhớ. Nếu thread khác sửa đổi một biến được tổ chức trong một đăng ký bởi chủ đề này, các giá trị đã trở nên không phù hợp và cần phải được refetched từ memory.OpenMP chỉ thị đã được thực thi nhất quán bộ nhớ thích hợp, vì vậy nó là hiếm cho nó để có một mối quan tâm forcodes song song sử dụng OpenMP. Tuy nhiên, có thể có tình huống mà nó là cần thiết để tự thực thi nhất quán.

OpenMP cho phép các nhà phát triển để xác định một cách rõ ràng những nơi trong mã nơi các biến cần phải được lưu vào bộ nhớ hoặc nạp từ bộ nhớ bằng cách sử dụng directive.Unless tuôn ra các chỉ định một danh sách các biến, nó được áp dụng cho tất cả các chủ đề trạng thái ban đầu. Nếu một danh sách các biến được quy định, các biến này hoặc là sẽ được lưu trữ vào bộ nhớ hoặc được nạp lại từ bộ nhớ phụ thuộc vào hành động là necessary.The ví dụ thể hiện trong Liệt kê 7.62 sử dụng được các chỉ tuôn ra để sản xuất ra một hàng rào ynchronization giữa một cặp bài.

Page 39: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Các chủ đề tổng thể phân bổ một mảng với một yếu tố duy nhất cho mỗi chủ đề. Tại khu vực song song, mỗi thread đặt chỉ mục của họ trong mảng đó để có một và sau đó chờ đợi cho thread láng giềng của họ để thiết lập chỉ mục của họ là khác không. Mỗi chủ đề được phát hành từ các rào cản khi sợi láng giềng đến. Chỉ thị tuôn ra được sử dụng để đảm bảo rằng các chủ đề hiện tại lưu giá trị của nó vào mảng và các chủ đề hiện tại liên tục tải lại các giá trị của hàng xóm của mình cho đến khi thread láng giềng đặt nó vào một.

Một ví dụ về song song

Như một ví dụ về song song tự động và song song sử dụng OpenMP, chúng tôi sẽ xem xét một mã ngắn để xác định xem một điểm trong một ma trận là trong hay ngoài của tập Mandelbrot. Listing 7.63 cho thấy mã.

Page 40: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Các mã trong Liệt kê 7.63 chứa một vòng lặp đơn. Vòng lặp này là không thích hợp cho tự động

song song với hai lý do:

+ Mỗi lần lặp phụ thuộc vào sự lặp trước. Nó không phải là có thể choviệc tính toán các hệ tiếp theo để bắt đầu cho đến khi lặp đi lặp lại trước đó đã hoàn thành. Thực tế này có nghĩa là các vòng lặp có thể được tính toán chỉ trong nối tiếp.

+ Sự lặp vòng lặp cho đến thời điểm hoặc thoát một vòng tròn bán kính 2 trung vào nguồn gốc hoặc số lượng lặp tối đa vượt quá. Kể từ khi số chuyến đi là chưa biết đến khi vòng lặp được thực thi, nó không phải là có thể giao việc để nhiều chủ đề bởi vì nó không được biết bao nhiêu công việc ở đó là để thực hiện.

Listing 7.64 cho thấy mã chính, bao gồm chỉ thị OpenMP song song. Điều nàyphân bổ một ma trận lớn để giữ kết quả của các phép tính và sau đó tính cho mọi điểm trong ma trận cho dù đó là trong hay ngoài của tập Mandelbrot. Các vòng cuối cùng trong mã này là hoàn toàn có để đảm bảo rằng trình biên dịch không loại bỏ các vòng chính bởi giá trị này không được sử dụng.

Để có được tự động song song với công việc, các hình chữ nhật thông thường phải được inlined để trình biên dịch có thể xác định song song đó là an toàn. Solaris Studio biên dịch equire một mức độ tối ưu hóa của ít nhất xO4. Listing 7.65 cho thấy kết quả của biên dịch mã. Trình biên dịch song song các cuộc gọi inlined để Inset, nhưng nó chỉ có thể parallelize vòng lặp trong cùng. Việc lặp vòng ngoài cùng trên một mảng của các con trỏ, và bội số của những con trỏ có thể trỏ đến các địa chỉ bộ nhớ; do đó, trình biên dịch không thể parallelize các vòng ngoài vì vấn đề răng cưa

Page 41: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Các mã nguồn trong Ví dụ 7.64 đã bao gồm một chỉ thị OpenMP để làm cho ngoài cùng vòng lặp song song. Listing 7.66 cho thấy kết quả của việc biên dịch và chạy mã OpenMP với số lượng khác nhau của chủ đề.

Mã này mất khoảng 29 giây của thời gian tường để chạy với một chủ đề duy nhất, khoảng 21 giây với hai chủ đề và chỉ hơn 23 giây với ba chủ đề. Điều này là xa toán lý tưởng, đó sẽ là thời gian chạy giảm tỷ lệ thuận với số lượng các đề chạy. Chú ý rằng thời gian sử dụng cho các mã vẫn không đổi. điều này có nghĩa là rằng khối lượng công việc được thực hiện, bất kể số lượng các đề used.This chỉ ra rằng tỉ lệ nghèo không phải là kết quả của các đề tài phải thực hiện một số lượng ngày càng tăng của công việc. Nếu số lượng công việc không tăng, nó cho thấy rằng những vấn đề rộng là kết quả của công việc đó được phân phối kém giữa các chủ đề.

Hình 7.1 cho thấy xem timeline từ Performance Analyzer Solaris Studio chạy mã với hai chủ đề. Quan điểm này cho thấy hoạt động của hai chủ đề trong toàn bộ thời gian của chạy. Có ba dòng hiển thị. Dòng đầu cho thấy các hoạt động của tất cả các chủ đề trong ứng dụng. Điều này cho thấy rằng ban đầu cả hai chủ đề được chạy hoàn toàn trong chế độ người dùng, và khoảng 8 giây vào chạy, chỉ có một trong hai chủ đề là trong chế độ người dùng trong khi thread khác là nhàn rỗi.

Page 42: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Hai dòng khác cho thấy các hoạt động của hai chủ đề. Người đầu cho thấy thread chủ đã hoạt động trong toàn bộ thời gian chạy, như là để được mong đợi của các mô hình thực hiện OpenMP. Các chủ đề thứ hai là hoạt động chỉ trong 8,5 giây đầu tiên của chạy. Điều này khẳng định rằng tỉ lệ người nghèo là vì một sự phân phối không đồng đều về công tác giữa hai chủ đề.

Nó rất dễ dàng để hiểu được sự mất cân bằng khối lượng công việc này xuất phát từ khi thực tế hình ảnh đang được tính toán được xem. Hình 7.2 cho thấy những hình ảnh đó đang được đề computed.One được tính toán một nửa trái, khác nửa bên phải. Đối với một số lượng lớn các thepoints, màu đen trong hình ảnh, nó chỉ mất một vài lần lặp để xác định thepoint đó không phải là trong bộ này. Tuy nhiên, nó có giới hạn tối đa về số lần lặp để xác định rằng một điểm là, hoặc có thể là, trong tập; những điểm này có màu trắng.

Các khu vực được tô màu đen trong hình chụp tương đối vài lần lặp và tính toán một cách nhanh chóng. Các khu vực được tô màu trắng mất nhiều lần lặp lại và do đó mất một thời gian để tính toán. So sánh hai nửa trái và bên phải của hình ảnh, nó là rõ ràng rằng nửa bên phải chứa các điểm ảnh màu đen hơn một nửa trái. Điều này có nghĩa thatthe đề tính toán một nửa bên phải sẽ mất ít thời gian hơn với thread tính toán một nửa trái. Đây là nguồn gốc của sự mất cân bằng khối lượng công việc giữa hai chủ đề. Sửa chữa các sự mất cân bằng khối lượng công việc tương đối dễ dàng vì nó chỉ là một vấn đề thay đổi mệnh lịch trình cho mã song song. Dù lịch trình năng động hoặc được hướng dẫn Ould được sử dụng. Listing 7.67 cho thấy mã sửa đổi để sử dụng lập lịch năng động

Page 43: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Listing 7.68 cho thấy các nhân rộng kết quả từ mã này. Với lịch trình năng động,công việc được phân bố đều trên các chủ đề, dẫn đến tăng hiệu suất gần như tuyến tính như số lượng các đề tăng.

tóm lược

Chương này đã thảo luận làm thế nào các trình biên dịch có thể kích hoạt song song hoặc là tự động hoặc bằng cách thêm chỉ thị OpenMP vào mã nguồn. Bây giờ bạn cần phải làm quen với những giới hạn song song tự động và các vấn đề điển hình trong các mã nguồn đó làm giảm khả năng của trình biên dịch để tự động parallelize mã. Bạn cũng sẽ có thể xác định và khắc phục những vấn đề này, dẫn đến mã với cải tiến rộng.

Page 44: chương trước đã đề cập ở mức độ thấp tiếp cận để tạo ra quy trình hoặc đề và chia sẻ dữ liệu giữa chúng.docx

Bạn cũng nên hiểu thế nào chỉ OpenMP có thể được sử dụng để sản xuất song song ứng dụng. Bạn sẽ biết các chỉ thị đồng bộ hóa khác nhau và các đối tượng được cung cấp bởi các đặc điểm kỹ thuật OpenMP. Bạn cũng sẽ biết làm thế nào để áp dụng hoặc sửa đổi các chỉ thị OpenMP để cải thiện tỉ lệ của một ứng dụng.