Chức năng cơ bản của MPI Giới thiệu về phát triển chương trình song song sử dụng MPI. Truy cập dữ liệu

chức năng MPI

Loại dẫn xuất, Hoạt động, Kiểu dữ liệu

Bsend Buffer_attach Get_count ANY_SOURCE Gửi recv_replace ANY_TAG Thăm dò

Allgetherv Alltoall Alltoallv Giảm Rduce_scatter Quét

Một kiểu dẫn xuất được xây dựng từ các kiểu MPI được xác định trước và các kiểu dẫn xuất được xác định trước đó bằng cách sử dụng các hàm tạo đặc biệt

MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct.

Một kiểu dẫn xuất mới được đăng ký bằng cách gọi hàm MPI_Type_commit. Chỉ sau khi đăng ký, một kiểu dẫn xuất mới mới có thể được sử dụng trong các hoạt động giao tiếp và trong việc xây dựng các kiểu khác. Các loại MPI được xác định trước được coi là đã đăng ký.

Khi loại dẫn xuất không còn cần thiết nữa, nó sẽ bị hủy bằng hàm MPI_Type_free.

1) MPI_Init - hàm khởi tạo. Kết quả của việc thực thi chức năng này là một nhóm quy trình được tạo trong đó tất cả các quy trình ứng dụng được đặt và một vùng giao tiếp được tạo, được mô tả bởi bộ giao tiếp được xác định trước MPI_COMM_WORLD.

MPI_Type_commit - đăng ký loại, MPI_Type_free - hủy loại

int MPI_Init(int *argc, char ***argv);

2) MPI_Finalize - Chức năng hoàn thiện các chương trình MPI. Chức năng này đóng tất cả các quy trình MPI và loại bỏ tất cả các khu vực giao tiếp.

int MPI_Finalize(void);

3) Chức năng xác định số lượng tiến trình trong vùng truyền thông MPI_Comm_size . Hàm trả về số lượng tiến trình trong vùng giao tiếp của commicator.

int MPI_Comm_size(MPI_Comm comm, int *size);

4) Chức năng phát hiện số tiến trình MPI_Comm_rank . Hàm trả về số của tiến trình đã gọi hàm này. Số quy trình nằm trong phạm vi 0..size-1.

int MPI_Comm_rank(MPI_Comm comm, int *xếp hạng);

5) Chức năng tin nhắn MPI_Gửi. Hàm gửi số phần tử của kiểu dữ liệu tin nhắn kèm theo thẻ định danh để xử lý đích trong vùng giao tiếp của commicator.

int MPI_Send(void* buf, int count, kiểu dữ liệu MPI_Datatype, int dest, int tag, MPI_Comm comm);

6) Chức năng tiếp nhận tin nhắn MPI_Recv. Hàm nhận các phần tử đếm của kiểu dữ liệu tin nhắn có thẻ định danh từ tiến trình nguồn trong vùng giao tiếp của commicator.

int MPI_Recv(void* buf, int count, kiểu dữ liệu MPI_Datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)

7) Chức năng hẹn giờ (timer) MPI_Wtime. Hàm trả về thời gian thiên văn tính bằng giây đã trôi qua kể từ một thời điểm nào đó trong quá khứ (điểm tham chiếu).

gấp đôi MPI_Wtime(void)

Các chức năng truyền thông điệp giữa các tiến trình được chia thành:

Tiền tố S (đồng bộ)

có nghĩa là chế độ truyền dữ liệu đồng bộ. Hoạt động truyền dữ liệu chỉ kết thúc khi quá trình nhận dữ liệu kết thúc. Chức năng này không cục bộ.

Tiền tố B (được đệm)

có nghĩa là chế độ truyền dữ liệu đệm. Trong không gian địa chỉ của quá trình gửi bằng cách sử dụng chức năng đặc biệt một bảng tạm được tạo để sử dụng trong các hoạt động trao đổi. Thao tác gửi kết thúc khi dữ liệu được đặt vào bộ đệm này. Chức năng này có tính chất cục bộ.

Tiền tố R (sẵn sàng)

chế độ truyền dữ liệu đã được thỏa thuận hoặc chuẩn bị sẵn. Hoạt động truyền dữ liệu chỉ bắt đầu khi bộ xử lý nhận đã thiết lập dấu hiệu sẵn sàng nhận dữ liệu, bắt đầu hoạt động nhận. Chức năng này không cục bộ.

Tiền tố I (ngay lập tức)

đề cập đến các hoạt động không chặn.

Cấu trúc MPI_Status

Sau khi đọc tin nhắn, một số thông số có thể không xác định được, chẳng hạn như số mục đã đọc, ID tin nhắn và địa chỉ người gửi. Thông tin này có thể thu được bằng cách sử dụng tham số trạng thái. Các biến trạng thái phải được khai báo rõ ràng trong chương trình MPI. Trong ngôn ngữ C, trạng thái là cấu trúc kiểu MPI_Status với ba trường MPI_SOURCE, MPI_TAG, MPI_ERROR.

8) Để xác định số lượng phần tử tin nhắn thực sự nhận được, bạn phải sử dụng một hàm đặc biệt MPI_Get_count .

int MPI_Get_count (trạng thái MPI_Status *, kiểu dữ liệu MPI_Datatype, int *count);

9) Bạn có thể xác định các tham số của tin nhắn đã nhận mà không cần đọc nó bằng hàm MPI_Probe. int MPI_Probe (nguồn int, thẻ int, MPI_Comm comm, MPI_Status *status);

10) Trong trường hợp bạn cần thực hiện giao tiếp lẫn nhau giữa các tiến trình, sẽ an toàn hơn khi sử dụng thao tác kết hợp MPI_Sendrecv . Trong thao tác này, dữ liệu đã gửi từ mảng buf sẽ được thay thế bằng dữ liệu đã nhận.

int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, MPI_Datatype recvtag, MPI_Comm comm, MPI_Status *status);

11) Chức năng kiểm tra việc hoàn thành hoạt động không chặn MPI_Test.

int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status);

Đây là một hoạt động không chặn cục bộ. Nếu thao tác liên quan đến yêu cầu đã hoàn tất, cờ = true sẽ được trả về và trạng thái chứa thông tin về thao tác đã hoàn thành. Nếu thao tác đang được kiểm tra chưa hoàn thành, flag = false sẽ được trả về và giá trị trạng thái không được xác định trong trường hợp này.

12) Chức năng hủy yêu cầu mà không cần đợi hoàn thành thao tác không chặn MPI_Request_free.

int MPI_Request_free(MPI_Request *request);

Tham số yêu cầu được đặt thành MPI_REQUEST_NULL.

13) Có thể đạt được việc thực thi hiệu quả hoạt động truyền dữ liệu từ một quy trình đến tất cả các quy trình của chương trình (truyền phát dữ liệu) bằng cách sử dụng chức năng MPI:

int MPI_Bcast(void *buf,int count,MPI_Datatype type,int root,MPI_Comm comm)

Hàm MPI_Bcast gửi dữ liệu từ bộ đệm chứa các phần tử đếm loại loại từ gốc được đánh số quy trình đến tất cả các quy trình có trong bộ truyền thông.

14) Nếu bạn cần nhận tin nhắn từ bất cứ ai quá trình gửi có thể có giá trị MPI_ANY_SOURCE được chỉ định cho tham số nguồn

15) Nếu cần nhận tin nhắn với bất kỳ thẻ nào, giá trị có thể được chỉ định cho tham số thẻ MPI_ANY_TAG

16) Tham số trạng thái cho phép bạn xác định một số đặc điểm của tin nhắn nhận được:

- trạng thái.MPI_SOURCE – xếp hạng quá trình gửi tin nhắn nhận được,

- status.MPI_TAG - thẻ của tin nhắn đã nhận.

17) Chức năng

MPI_Get_count t(trạng thái MPI_Status *, loại MPI_Datatype, int *count)

trả về biến count số phần tử thuộc loại trong tin nhắn đã nhận.

18) Các hoạt động chuyển dữ liệu từ tất cả các tiến trình sang một tiến trình. Trong hoạt động này trên

các giá trị thực hiện xử lý dữ liệu này hoặc cách xử lý dữ liệu khác (để nhấn mạnh điểm cuối cùng hoạt động này còn gọi là hoạt động giảm dữ liệu)

int MPI_Reduce (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,int root,MPI_Comm comm)

19) Đồng bộ hóa quy trình, tức là việc đạt được đồng thời các quá trình của các điểm nhất định của quá trình tính toán được đảm bảo bằng cách sử dụng hàm MPI: int MPI_Barrier(MPI_Comm comm); Hàm MPI_Barrier xác định một hoạt động tập thể và do đó, khi được sử dụng, phải được gọi bởi tất cả các tiến trình của bộ giao tiếp được sử dụng. Khi gọi hàm MPI_Barrier

việc thực thi quy trình bị chặn; việc tính toán quy trình sẽ chỉ tiếp tục sau khi tất cả các quy trình của bộ giao tiếp đã gọi hàm MPI_Barrier.

20) Để sử dụng chế độ truyền đệm, bộ đệm bộ nhớ MPI phải được tạo và truyền

để đệm các thông báo – hàm được sử dụng cho việc này trông giống như: int MPI_Buffer_attach (void *buf, int size),

- bộ nhớ đệm buf để đệm tin nhắn,

- kích thước - kích thước bộ đệm.

21) Sau khi kết thúc làm việc với bộ đệm, nó phải được ngắt kết nối khỏi MPI bằng chức năng:

int MPI_Buffer_detach (void *buf, int *size).

22) Có thể đạt được việc thực hiện đồng thời hiệu quả và đảm bảo các hoạt động truyền và nhận dữ liệu bằng cách sử dụng chức năng MPI:

int MPI_Sendrecv (void *sbuf,int scount,MPI_Datatype stype,int Dest, int stag, void *rbuf,int rcount,MPI_Datatype

rtype,int source,int rtag, MPI_Comm comm, MPI_Status *status)

23) Khi các tin nhắn cùng loại, MPI có khả năng sử dụng một bộ đệm duy nhất: intMPI_Sendrecv_replace (void *buf, int count, MPI_Datatype type, int dest,

int stag, int source, int rtag, MPI_Comm comm, trạng thái MPI_Status*)

24) Hoạt động tổng quát của việc truyền dữ liệu từ một quy trình đến tất cả các quy trình (phân phối dữ liệu) khác với việc phát sóng ở chỗ quy trình truyền dữ liệu khác nhau đến các quy trình (xem Hình 4.4). Hoạt động này có thể được thực hiện bằng cách sử dụng chức năng:

int MPI_Scatter (void *sbuf,int scount,MPI_Datatype stype,

25) Hoạt động truyền dữ liệu tổng quát từ tất cả các bộ xử lý sang một quy trình (thu thập dữ liệu) là đảo ngược của quy trình phân phối dữ liệu (xem Hình 4.5). Để thực hiện thao tác này trong MPI, có một chức năng:

int MPI_Gather (void *sbuf,int scount,MPI_Datatype stype,

void *rbuf,int rcount,MPI_Datatype rtype, int root, MPI_Comm comm)

26) Cần lưu ý rằng khi sử dụng hàm MPI_Gather, việc thu thập dữ liệu chỉ được thực hiện

trên một quá trình. Để có được tất cả dữ liệu được thu thập trên mỗi quy trình giao tiếp

bạn cần sử dụng chức năng thu thập và phân phối:

int MPI_Allgather (void *sbuf, int scount, MPI_Datatype stype, void *rbuf, int rcount, MPI_Datatype rtype, MPI_Comm comm)

27) Truyền dữ liệu từ tất cả các tiến trình sang tất cả các tiến trình là cách tốt nhất hoạt động chung truyền dữ liệu (xem hình 4.6). Thao tác này có thể được thực hiện bằng cách sử dụng hàm:

int MPI_Alltoall (void *sbuf,int scount,MPI_Datatype stype, void *rbuf,int rcount,MPI_Datatype rtype,MPI_Comm comm)

28) Hàm MPI_Reduce cung cấp kết quả rút gọn dữ liệu

chỉ trên một tiến trình. Để có được kết quả giảm dữ liệu trên từng quy trình giao tiếp, bạn phải sử dụng chức năng giảm và phân phối:

int MPI_Allreduce (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm).

29) Và một phiên bản khác của hoạt động thu thập và xử lý dữ liệu, đảm bảo thu được tất cả các kết quả giảm một phần, có thể thu được bằng cách sử dụng hàm:

int MPI_Scan (void *sendbuf, void *recvbuf,int count,MPI_Datatype type, MPI_Op op,MPI_Comm comm).

Sơ đồ thực hiện chung của hàm MPI_Scan được hiển thị trong Hình 2. 4.7. Các phần tử của bản tin nhận được thể hiện kết quả xử lý các phần tử tương ứng của bản tin được truyền bởi các tiến trình và thu được kết quả trên một tiến trình có hạng i, 0

30) Giá trị ban đầu của biến bufpos phải được hình thành trước khi quá trình đóng gói bắt đầu và sau đó được thiết lập bởi hàm MPI_Pack. Hàm MPI_Pack được gọi tuần tự để đóng gói tất cả dữ liệu cần thiết.

int MPI_Pack_size (số int, loại MPI_Datatype, MPI_Comm comm, int *size)

31) Sau khi đóng gói tất cả dữ liệu cần thiết, bộ đệm đã chuẩn bị có thể được sử dụng trong các chức năng truyền dữ liệu với loại MPI_PACKED được chỉ định.

Sau khi nhận được tin nhắn có loại MPI_PACKED, dữ liệu có thể được giải nén bằng chức năng:

int MPI_Unpack (void *buf, int bufsize, int *bufpos, void *data, int count, loại MPI_Datatype, MPI_Comm comm)

Máy tính tập lệnh phức tạp

CISC (Tính toán tập lệnh phức tạp tiếng Anh hoặc máy tính tập lệnh phức tạp tiếng Anh -

máy tính có bộ hướng dẫn đầy đủ) là một khái niệm thiết kế bộ xử lý được đặc trưng bởi tập hợp các thuộc tính sau:

một số lượng tương đối nhỏ các thanh ghi có mục đích chung;

· một số lượng lớn các lệnh máy, một số lệnh được tải về mặt ngữ nghĩa tương tự như các toán tử của ngôn ngữ lập trình cấp cao và được thực thi trong nhiều chu kỳ xung nhịp;

· một số lượng lớn các phương pháp đánh địa chỉ;

· một số lượng lớn các định dạng lệnh có kích thước bit khác nhau;

· ưu thế của định dạng lệnh hai địa chỉ;

· sự hiện diện của các lệnh xử lý kiểu bộ nhớ đăng ký.

Sai sót:

chi phí phần cứng cao; khó khăn trong việc song song hóa các phép tính.

Kỹ thuật xây dựng hệ thống hướng dẫn CISC ngược lại với một kỹ thuật khác - RISC. Sự khác biệt giữa các khái niệm này nằm ở phương pháp lập trình, không phải ở kiến ​​trúc bộ xử lý thực tế. Hầu hết tất cả các bộ xử lý hiện đại đều mô phỏng cả tập lệnh loại RISC và CISC.

Giảm hướng dẫn đặt máy tính

Nó dựa trên các nguyên tắc của kiến ​​trúc RISC: định dạng lệnh cố định, hoạt động đăng ký, thực hiện lệnh một chu kỳ, phương pháp đánh địa chỉ đơn giản và tệp thanh ghi lớn. Đồng thời, có một số tính năng quan trọng giúp phân biệt kiến ​​trúc này với kiến ​​trúc của các bộ xử lý RISC khác. Chúng bao gồm: một bộ thanh ghi độc lập cho từng bộ truyền động; đưa các hướng dẫn giống CISC riêng lẻ vào hệ thống; thiếu cơ chế “chuyển tiếp chậm trễ”; một cách ban đầu để thực hiện các bước nhảy có điều kiện. Các ứng dụng chính của kiến ​​trúc bộ vi xử lý là các máy chủ và siêu máy tính hiệu suất cao.

Những máy tính như vậy dựa trên một kiến ​​trúc tách biệt các lệnh xử lý khỏi các lệnh bộ nhớ và nhấn mạnh vào đường ống hiệu quả. Hệ thống lệnh được thiết kế sao cho việc thực hiện bất kỳ lệnh nào chỉ mất một số lượng nhỏ chu kỳ máy (tốt nhất là một chu kỳ máy). Bản thân logic để thực thi các lệnh nhằm tăng hiệu suất đã tập trung vào phần cứng hơn là triển khai phần sụn. Để đơn giản hóa logic giải mã lệnh, các lệnh có độ dài cố định đã được sử dụng

định dạng cố định.

TRONG Điểm của công nghệ đệm địa chỉ mục tiêu chuyển đổi là gì?

TRONG Bộ xử lý có cơ chế dự đoán linh hoạt hướng chuyển đổi. Với cái này

Mục tiêu trên chip là một bộ nhớ đệm nhỏ gọi là bộ đệm đích nhánh (BTB) và hai cặp bộ đệm tìm nạp trước lệnh độc lập (hai bộ đệm 32 bit trên mỗi đường dẫn). Bộ đệm địa chỉ đích nhánh lưu trữ địa chỉ của các lệnh nằm trong bộ đệm tìm nạp trước. Hoạt động của bộ đệm tìm nạp trước được tổ chức theo cách tại bất kỳ thời điểm nào, các lệnh chỉ được tìm nạp vào một trong các bộ đệm của cặp tương ứng. Khi một hoạt động nhánh được phát hiện trong luồng lệnh, địa chỉ nhánh được tính toán sẽ được so sánh với các địa chỉ được lưu trong bộ đệm BTB. Nếu có sự trùng khớp, nhánh được dự đoán sẽ diễn ra và một bộ đệm tìm nạp trước khác sẽ được bật và bắt đầu đưa ra lệnh tới đường dẫn tương ứng để thực thi. Nếu có sự không khớp, giả định rằng nhánh sẽ không được thực thi và bộ đệm tìm nạp trước không được chuyển đổi, tiếp tục thứ tự phát lệnh thông thường. Điều này tránh thời gian ngừng hoạt động của băng tải

Xung đột cơ cấu và cách giảm thiểu chúng

Chế độ thực thi lệnh kết hợp thường yêu cầu phân phối các đơn vị chức năng và sao chép tài nguyên để giải quyết tất cả các kết hợp lệnh có thể có trong quy trình. Nếu bất kỳ sự kết hợp nào của lệnh không thành công

được chấp nhận do xung đột tài nguyên thì máy được cho là có xung đột về cấu trúc. Ví dụ điển hình nhất về máy có thể phát sinh xung đột về cấu trúc là máy có các thiết bị chức năng không được băng tải đầy đủ.

Giảm thiểu: Đường ống tạm dừng việc thực thi một trong các lệnh cho đến khi thiết bị được yêu cầu khả dụng.

Xung đột dữ liệu, dừng đường ống và thực hiện cơ chế bỏ qua

Một trong những yếu tố có tác động đáng kể đến hiệu suất của hệ thống băng tải là sự phụ thuộc logic giữa các lệnh. Xung đột dữ liệu phát sinh khi việc sử dụng xử lý đường ống có thể thay đổi thứ tự của các lệnh gọi toán hạng sao cho thứ tự này khác với thứ tự được tuân thủ khi các lệnh được thực thi tuần tự trên máy không có đường ống. Vấn đề đặt ra trong ví dụ này có thể được giải quyết bằng cách sử dụng một kỹ thuật phần cứng khá đơn giản gọi là chuyển tiếp dữ liệu, bỏ qua dữ liệu hoặc đôi khi đoản mạch.

Xung đột dữ liệu khiến quy trình tạm dừng

Thay vào đó, chúng ta cần phần cứng bổ sung, được gọi là phần cứng interlook đường ống, để đảm bảo ví dụ chạy chính xác. Nói chung, loại thiết bị này phát hiện xung đột và tạm dừng đường ống miễn là xung đột vẫn tồn tại. Trong trường hợp này, phần cứng này tạm dừng quy trình bắt đầu bằng lệnh muốn sử dụng dữ liệu trong khi lệnh trước đó, kết quả của nó là toán hạng đối với lệnh của chúng tôi, tạo ra kết quả đó. Thiết bị này khiến dây chuyền sản xuất bị đình trệ hoặc xảy ra hiện tượng “bong bóng” tương tự như trường hợp xung đột về cấu trúc.

Bộ đệm dự đoán nhánh có điều kiện

Bộ đệm dự đoán nhánh có điều kiện là một bộ nhớ nhỏ được định địa chỉ bằng các bit có ý nghĩa nhỏ nhất trong địa chỉ của lệnh rẽ nhánh. Mỗi ô của bộ nhớ này chứa một bit, cho biết nhánh trước đó có được thực thi hay không. Đây là loại bộ đệm đơn giản nhất thuộc loại này. Nó không có thẻ và chỉ hữu ích để giảm độ trễ của nhánh trong trường hợp độ trễ dài hơn thời gian cần thiết để tính giá trị của địa chỉ đích của nhánh. Bộ đệm dự đoán nhánh có thể được triển khai dưới dạng một bộ nhớ đệm chuyên dụng nhỏ được địa chỉ lệnh truy cập trong giai đoạn tìm nạp lệnh của đường ống (IF) hoặc dưới dạng một cặp bit được liên kết với từng khối bộ đệm lệnh và được tìm nạp theo từng lệnh.

Chỉ có thể chạy ứng dụng MPI trên cụm máy tính thông qua hệ thống xử lý công việc hàng loạt. Để đơn giản hóa việc khởi chạy và xếp hàng chương trình song song, một tập lệnh mpirun đặc biệt được cung cấp. Ví dụ: mpirun -np 20 ./first.exe sẽ chạy chương trình song song first.exe trên 20 bộ xử lý, tức là. tại 5 nút. (Mỗi nút có 2 bộ xử lý lõi kép). Điều đáng lưu ý là để khởi chạy một mô-đun thực thi nằm trong thư mục hiện tại ($pwd), bạn phải chỉ định rõ ràng đường dẫn “./” Một số triển khai MPI-1 cung cấp lệnh khởi chạy cho các chương trình MPI, có dạng mpirun<аргументы mpirun><программа><аргументы программы>

Việc tách lệnh khởi chạy chương trình khỏi chính chương trình mang lại sự linh hoạt, đặc biệt đối với việc triển khai nối mạng và không đồng nhất. Việc có cơ chế khởi chạy tiêu chuẩn cũng mở rộng khả năng di động của các chương trình MPI thêm một bước nữa đối với các dòng lệnh và các tập lệnh thao tác chúng. Ví dụ: tập lệnh cho một tập hợp các chương trình xác thực chạy hàng trăm chương trình có thể là tập lệnh di động nếu nó được viết bằng cơ chế khởi chạy tiêu chuẩn như vậy. Để không nhầm lẫn lệnh `` tiêu chuẩn '' với lệnh hiện có trong thực tế, không phải là tiêu chuẩn và không thể mang theo trong số các triển khai, MPI đã định nghĩa mpiexec thay vì mpirun.

Mặc dù cơ chế khởi chạy được tiêu chuẩn hóa cải thiện khả năng sử dụng của MPI, nhưng phạm vi môi trường rất đa dạng (ví dụ: thậm chí có thể không có giao diện dòng lệnh) nên MPI không thể ủy quyền cho cơ chế như vậy. Thay vào đó, MPI xác định lệnh chạy mpiexec và khuyến nghị, nhưng không yêu cầu, như một lời khuyên cho các nhà phát triển. Tuy nhiên, nếu việc triển khai cung cấp một lệnh có tên mpiexec thì nó phải có dạng được mô tả bên dưới: mpiexec -n <программа>

sẽ có ít nhất một cách để chạy<программу>với MPI_COMM_WORLD ban đầu có nhóm chứa quá trình. Các đối số khác đối với mpiexec có thể phụ thuộc vào việc triển khai.

Ví dụ 4.1 Chạy 16 phiên bản myprog trên máy hiện tại hoặc máy mặc định:

mpiexec -n 16 myprog

3. Viết chương trình tính song song tích phân xác định của hàm 2*(x+2*x*x/1200.0) trong khoảng .

Phương pháp hình chữ nhật bên trái

gấp đôi f(gấp đôi x)

(return 2*(x+2*x*x/1200);) // tích phân iskomyi

int main(int argc,char **argv)

MPI_Trạng thái trạng thái;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

int n=1000,i,d; // 1000 - uzly

thả nổi a=0, b=1, h=(b-a)/n,s=0,r=0; //a i b -nachalo i konec otrezka

if (rank!=size-1) // schitaut vse processy, krome poslednego

( for (i=rank*d; i<(rank+1)*d; i++) { s=s+h*f(a+i*h); }

MPI_Send(&s,1,MPI_FLOAT,size-1,1,MPI_COMM_WORLD);)

(với (i=0; tôi

( MPI_Recv(&s,1,MPI_FLOAT,i,1,MPI_COMM_WORLD, &status); r+=s; ) )

MPI_Finalize();)

Surak

1. Kiến trúc bộ nhớ chia sẻ và phân tán

Bộ nhớ chia sẻ phân tán (DSM - Bộ nhớ chia sẻ phân tán)

Theo truyền thống, điện toán phân tán dựa trên mô hình truyền tin nhắn, trong đó dữ liệu được truyền từ bộ xử lý này sang bộ xử lý khác dưới dạng tin nhắn. Các cuộc gọi thủ tục từ xa thực sự là cùng một mô hình (hoặc rất gần). DSM là không gian địa chỉ ảo được chia sẻ bởi tất cả các nút (bộ xử lý) của hệ thống phân tán. Các chương trình truy cập dữ liệu trong DSM giống như cách chúng truy cập dữ liệu trong bộ nhớ ảo của máy tính truyền thống. Trong các hệ thống có DSM, dữ liệu di chuyển giữa các bộ nhớ cục bộ của các máy tính khác nhau giống như cách nó di chuyển giữa RAM và bộ nhớ ngoài của một máy tính. Cấu hình bộ nhớ dùng chung phân tán là một biến thể của bộ nhớ phân tán. Ở đây, tất cả các nút, bao gồm một hoặc nhiều bộ xử lý được kết nối thông qua sơ đồ SMP, sử dụng một không gian địa chỉ chung. Sự khác biệt giữa cấu hình này và máy có bộ nhớ phân tán là ở đây bất kỳ bộ xử lý nào cũng có thể truy cập bất kỳ phần nào của bộ nhớ. Tuy nhiên, thời gian truy cập vào các phần bộ nhớ khác nhau sẽ khác nhau đối với mỗi bộ xử lý tùy thuộc vào vị trí của phần đó trong cụm. Vì lý do này, những cấu hình như vậy còn được gọi là máy có quyền truy cập bộ nhớ không đồng nhất (NUMA).

Sự khác biệt giữa MPI và PVM

Hệ thống PVM (Máy ảo song song) được tạo ra để kết hợp một số máy trạm được nối mạng thành một máy tính song song ảo duy nhất. Hệ thống này là một tiện ích bổ sung cho hệ điều hành UNIX và được sử dụng trên nhiều nền tảng phần cứng khác nhau, bao gồm cả các hệ thống song song ồ ạt. Các hệ thống lập trình song song phổ biến nhất hiện nay đều dựa trên MPI (Giao diện phân tích tin nhắn). Ý tưởng về MPI ban đầu rất đơn giản và rõ ràng. Nó liên quan đến việc biểu diễn một chương trình song song dưới dạng một tập hợp các quy trình thực thi song song tương tác với nhau trong quá trình thực hiện truyền dữ liệu bằng các thủ tục truyền thông. Họ tạo nên thư viện MPI. Tuy nhiên, việc triển khai MPI phù hợp để hỗ trợ liên lạc giữa các bộ xử lý đã được chứng minh là khá khó khăn. Sự phức tạp này gắn liền với nhu cầu đạt được hiệu suất chương trình cao, nhu cầu sử dụng nhiều tài nguyên đa máy tính và do đó, có sự đa dạng lớn trong việc thực hiện các thủ tục giao tiếp tùy thuộc vào chế độ xử lý dữ liệu.

Chú thích: Bài giảng tập trung vào việc xem xét công nghệ MPI như một tiêu chuẩn lập trình song song cho các hệ thống bộ nhớ phân tán. Các phương thức truyền dữ liệu chính được xem xét. Các khái niệm như nhóm quy trình và người giao tiếp được giới thiệu. Bao gồm các loại dữ liệu cơ bản, hoạt động điểm-điểm, hoạt động tập thể, hoạt động đồng bộ hóa và đo thời gian.

Mục đích của bài giảng: Bài giảng nhằm mục đích nghiên cứu phương pháp chung để phát triển các thuật toán song song.

Quay video bài giảng - (khối lượng - 134 MB).

5.1. MPI: các khái niệm và định nghĩa cơ bản

Chúng ta hãy xem xét một số khái niệm và định nghĩa cơ bản của tiêu chuẩn MPI.

5.1.1. Khái niệm chương trình song song

Dưới chương trình song song trong khuôn khổ MPI, chúng tôi hiểu một tập hợp các nhiệm vụ được thực hiện đồng thời quy trình. Các quy trình có thể được thực thi trên các bộ xử lý khác nhau, nhưng một số quy trình cũng có thể được đặt trên cùng một bộ xử lý (trong trường hợp này, chúng được thực thi ở chế độ chia sẻ thời gian). Trong trường hợp cực đoan, một bộ xử lý duy nhất có thể được sử dụng để thực thi chương trình song song - theo quy định, phương pháp này được sử dụng để kiểm tra ban đầu tính đúng đắn của chương trình song song.

Mỗi tiến trình của một chương trình song song được sinh ra từ một bản sao của cùng một mã chương trình ( mô hình SPMP). Mã chương trình này, được trình bày dưới dạng một chương trình thực thi, phải có sẵn tại thời điểm chương trình song song được khởi chạy trên tất cả các bộ xử lý được sử dụng. Mã nguồn cho chương trình thực thi được phát triển bằng ngôn ngữ thuật toán C hoặc Fortran bằng cách sử dụng cách triển khai này hoặc cách khác của thư viện MPI.

Số lượng quy trình và số lượng bộ xử lý được sử dụng được xác định tại thời điểm chương trình song song được khởi chạy bằng môi trường thực thi chương trình MPI và không thể thay đổi trong quá trình tính toán (tiêu chuẩn MPI-2 cung cấp khả năng thay đổi linh hoạt số lượng quy trình). Tất cả các tiến trình của chương trình được đánh số tuần tự từ 0 đến p-1, Ở đâu P là tổng số tiến trình Số tiến trình được gọi thứ hạng quá trình.

5.1.2. Hoạt động truyền dữ liệu

MPI dựa trên các hoạt động truyền tin nhắn. Trong số các chức năng được cung cấp như một phần của MPI, có những chức năng khác nhau đôi (điểm-điểm) hoạt động giữa hai quá trình và tập thể (tập thể) các hành động giao tiếp để tương tác đồng thời của một số quy trình.

Để thực hiện các hoạt động được ghép nối, có thể sử dụng các chế độ truyền khác nhau, bao gồm đồng bộ, chặn, v.v. - xem xét đầy đủ các khả năng có thể phương thức truyền tải sẽ được thực hiện trong tiểu mục 5.3.

Như đã lưu ý trước đó, tiêu chuẩn MPI quy định nhu cầu triển khai hầu hết các hoạt động truyền dữ liệu chung cơ bản - xem tiểu mục 5.2 và 5.4.

5.1.3. Khái niệm về người giao tiếp

Các tiến trình của một chương trình song song được kết hợp thành các nhóm. Dưới người giao tiếp MPI đề cập đến một đối tượng dịch vụ được tạo đặc biệt kết hợp một nhóm quy trình và một số tham số bổ sung ( bối cảnh) được sử dụng khi thực hiện các thao tác truyền dữ liệu.

Thông thường, các hoạt động truyền dữ liệu ghép đôi được thực hiện cho các tiến trình thuộc cùng một bộ truyền tin. Các hoạt động tập thể được áp dụng đồng thời cho tất cả các quy trình giao tiếp. Do đó, việc chỉ định bộ giao tiếp sẽ sử dụng là bắt buộc đối với các hoạt động truyền dữ liệu trong MPI.

Trong quá trình tính toán, các nhóm quy trình và bộ truyền thông mới có thể được tạo và xóa các nhóm quy trình hiện có. Quá trình tương tự có thể thuộc về các nhóm và người giao tiếp khác nhau. Tất cả các quy trình có trong chương trình song song đều được bao gồm trong bộ giao tiếp được tạo theo mặc định với mã định danh MPI_COMM_WORLD.

Nếu cần truyền dữ liệu giữa các tiến trình từ các nhóm khác nhau thì cần phải tạo một bộ truyền thông toàn cầu ( máy liên lạc).

Thảo luận chi tiết về khả năng làm việc với nhóm và người truyền thông của MPI sẽ được trình bày trong tiểu mục 5.6.

5.1.4. Loại dữ liệu

Khi thực hiện các thao tác chuyển tin nhắn, bạn phải chỉ định dữ liệu được gửi hoặc nhận trong các hàm MPI. kiểu dữ liệu đã gửi. MPI chứa một tập hợp lớn các loại cơ bản dữ liệu phần lớn trùng khớp với các kiểu dữ liệu trong ngôn ngữ thuật toán C và Fortran. Ngoài ra, MPI còn có khả năng tạo mới các loại dẫn xuất dữ liệu để mô tả chính xác và ngắn gọn hơn về nội dung của các tin nhắn được chuyển tiếp.

Thảo luận chi tiết về khả năng làm việc với các kiểu dữ liệu dẫn xuất của MPI sẽ được trình bày trong tiểu mục 5.5.

5.1.5. Cấu trúc liên kết ảo

Như đã lưu ý trước đó, các hoạt động truyền dữ liệu được ghép nối có thể được thực hiện giữa bất kỳ quy trình nào của cùng một bộ giao tiếp và tất cả các quy trình của bộ giao tiếp đều tham gia vào một hoạt động chung. Về vấn đề này, cấu trúc liên kết logic của các đường liên lạc giữa các tiến trình có cấu trúc của một biểu đồ hoàn chỉnh (bất kể sự hiện diện của các kênh liên lạc vật lý thực sự giữa các bộ xử lý).

Đồng thời (và điều này đã được lưu ý trong Phần 3), để trình bày và phân tích tiếp theo một số thuật toán song song, nên có một biểu diễn logic của mạng truyền thông hiện có dưới dạng các cấu trúc liên kết nhất định.

MPI có khả năng biểu diễn nhiều tiến trình dưới dạng lưới sắt kích thước tùy ý (xem tiểu mục 5.7). Trong trường hợp này, các quá trình biên của các mạng có thể được khai báo lân cận và do đó, dựa trên các mạng, các cấu trúc thuộc loại hình xuyến.

Ngoài ra, MPI còn có các công cụ để tạo cấu trúc liên kết logic (ảo) thuộc bất kỳ loại nào được yêu cầu. Thảo luận chi tiết về khả năng làm việc với cấu trúc liên kết của MPI sẽ được trình bày trong tiểu mục 5.7.

Và cuối cùng, một số ghi chú cuối cùng trước khi bắt đầu xem xét MPI:

  • Mô tả chức năng và tất cả các ví dụ về chương trình được cung cấp sẽ được trình bày bằng ngôn ngữ thuật toán C; tính năng sử dụng MPI cho ngôn ngữ thuật toán Fortran sẽ được trình bày ở phần 5.8.1,
  • Mô tả ngắn gọn về các triển khai sẵn có của thư viện MPI và mô tả chung về môi trường thực thi của các chương trình MPI sẽ được thảo luận trong phần 5.8.2.
  • Phần trình bày chính về các khả năng của MPI sẽ tập trung vào tiêu chuẩn phiên bản 1.2 ( MPI-1); các thuộc tính bổ sung của tiêu chuẩn phiên bản 2.0 sẽ được trình bày trong điều 5.8.3.

Khi bắt đầu nghiên cứu MPI, có thể lưu ý rằng, một mặt, MPI khá phức tạp - tiêu chuẩn MPI cung cấp sự hiện diện của hơn 125 chức năng. Mặt khác, cấu trúc của MPI được tính toán cẩn thận - việc phát triển các chương trình song song có thể bắt đầu sau khi chỉ xem xét 6 chức năng của MPI. Tất cả các tính năng bổ sung của MPI có thể được nắm vững khi độ phức tạp của các thuật toán và chương trình được phát triển tăng lên. Theo phong cách này – từ đơn giản đến phức tạp – tất cả tài liệu giáo dục về MPI sẽ được trình bày sâu hơn.

5.2. Giới thiệu về phát triển chương trình song song sử dụng MPI

5.2.1. Cơ bản về MPI

Chúng tôi trình bày tập hợp các hàm MPI tối thiểu cần thiết, đủ để phát triển các chương trình song song khá đơn giản.

5.2.1.1 Khởi tạo và kết thúc chương trình MPI

Hàm đầu tiên được gọi MPI phải là một hàm:

int MPI_Init (int *agrc, char ***argv);

để khởi tạo môi trường thực thi chương trình MPI. Các tham số của hàm là số lượng đối số trên dòng lệnh và văn bản của chính dòng lệnh đó.

Hàm cuối cùng được gọi MPI phải là một hàm:

int MPI_Finalize(void);

Do đó, có thể lưu ý rằng cấu trúc của một chương trình song song được phát triển bằng MPI phải có dạng sau:

#include "mpi.h" int main (int argc, char *argv) (<программный код без использования MPI функций>MPI_Init(&agrc, &argv);<программный код с использованием MPI функций>MPI_Finalize();<программный код без использования MPI функций>trả về 0; )

Cần lưu ý:

  1. Tài liệu mpi.h chứa các định nghĩa về hằng số được đặt tên, nguyên mẫu hàm và kiểu dữ liệu của thư viện MPI,
  2. Chức năng MPI_InitMPI_Hoàn thiện là bắt buộc và phải được thực thi (và chỉ một lần) bởi mỗi tiến trình của chương trình song song,
  3. Trước cuộc gọi MPI_Init chức năng có thể được sử dụng MPI_Khởi tạođể xác định xem cuộc gọi trước đó đã được thực hiện chưa MPI_Init.

Các ví dụ về hàm được thảo luận ở trên đưa ra ý tưởng về cú pháp đặt tên hàm trong MPI. Tên hàm được đặt trước tiền tố MPI, theo sau là một hoặc nhiều từ trong tên, từ đầu tiên của tên hàm bắt đầu bằng ký tự viết hoa và các từ được phân tách bằng dấu gạch dưới. Tên của các hàm MPI thường giải thích mục đích của các hành động mà hàm đó thực hiện.

Cần lưu ý:

  • Người giao tiếp MPI_COMM_WORLD, như đã lưu ý trước đó, được tạo theo mặc định và đại diện cho tất cả các tiến trình của chương trình song song đang được thực thi,
  • Xếp hạng thu được bằng cách sử dụng hàm MPI_Comm_rank, là thứ hạng của quá trình thực hiện lệnh gọi hàm này, tức là Biến đổi ProcRank sẽ lấy các giá trị khác nhau trong các tiến trình khác nhau.
  • Hướng dẫn

Trong bài đăng này, chúng tôi sẽ nói về việc tổ chức trao đổi dữ liệu bằng MPI bằng ví dụ về Thư viện Intel MPI. Chúng tôi nghĩ rằng thông tin này sẽ hữu ích cho bất kỳ ai muốn làm quen với lĩnh vực tính toán hiệu năng cao song song trong thực tế.

Chúng tôi sẽ cung cấp mô tả ngắn gọn về cách tổ chức trao đổi dữ liệu trong các ứng dụng song song dựa trên MPI, cũng như các liên kết đến các nguồn bên ngoài với mô tả chi tiết hơn. Trong phần thực hành, bạn sẽ tìm thấy mô tả về tất cả các giai đoạn phát triển ứng dụng demo MPI “Hello World”, bắt đầu từ việc thiết lập môi trường cần thiết và kết thúc bằng việc khởi chạy chương trình.

MPI (Giao diện truyền tin nhắn)

MPI là giao diện truyền thông điệp giữa các tiến trình thực hiện cùng một nhiệm vụ. Nó chủ yếu dành cho các hệ thống bộ nhớ phân tán (MPP), trái ngược với OpenMP chẳng hạn. Theo quy tắc, hệ thống (cụm) phân tán là một tập hợp các nút điện toán được kết nối bằng các kênh liên lạc hiệu suất cao (ví dụ: InfiniBand).

MPI là tiêu chuẩn giao diện dữ liệu phổ biến nhất cho lập trình song song. Việc tiêu chuẩn hóa MPI được thực hiện bởi Diễn đàn MPI. Có các triển khai MPI cho hầu hết các nền tảng, hệ điều hành và ngôn ngữ hiện đại. MPI được sử dụng rộng rãi trong việc giải quyết các vấn đề khác nhau trong vật lý tính toán, dược phẩm, khoa học vật liệu, di truyền học và các lĩnh vực kiến ​​thức khác.

Từ quan điểm của MPI, một chương trình song song là một tập hợp các tiến trình chạy trên các nút tính toán khác nhau. Mỗi quá trình được sinh ra từ cùng một mã chương trình.

Hoạt động chính trong MPI là truyền tin nhắn. MPI thực hiện hầu hết các mô hình giao tiếp cơ bản: điểm-điểm, tập thể và một chiều.

Làm việc với MPI

Chúng ta hãy xem một ví dụ trực tiếp về cách cấu trúc một chương trình MPI điển hình. Là một ứng dụng demo, hãy lấy mã nguồn mẫu đi kèm với Thư viện Intel MPI. Trước khi chạy chương trình MPI đầu tiên, chúng ta cần chuẩn bị và thiết lập môi trường làm việc cho các thử nghiệm.

Thiết lập môi trường cụm

Đối với các thử nghiệm, chúng ta sẽ cần một cặp nút tính toán (tốt nhất là có các đặc điểm tương tự). Nếu bạn không có sẵn hai máy chủ, bạn luôn có thể sử dụng các dịch vụ đám mây.

Để minh họa, tôi đã chọn dịch vụ Đám mây điện toán đàn hồi Amazon (Amazon EC2). Amazon cung cấp cho người dùng mới một năm dùng thử miễn phí các máy chủ cấp cơ bản.

Làm việc với Amazon EC2 rất trực quan. Nếu có thắc mắc bạn có thể tham khảo tài liệu chi tiết (bằng tiếng Anh). Nếu muốn, bạn có thể sử dụng bất kỳ dịch vụ tương tự nào khác.

Chúng tôi tạo hai máy chủ ảo đang hoạt động. Trong bảng điều khiển quản lý, chọn Máy chủ ảo EC2 trên đám mây, sau đó Khởi chạy phiên bản("Phiên bản" có nghĩa là phiên bản máy chủ ảo).

Bước tiếp theo là chọn hệ điều hành. Thư viện Intel MPI hỗ trợ cả Linux và Windows. Đối với lần đầu làm quen với MPI, chúng ta sẽ chọn OS Linux. Chọn Red Hat Enterprise Linux 6.6 64-bit hoặc SLES11.3/12.0.
Chọn Loại phiên bản(Loại máy chủ). Đối với các thử nghiệm, t2.micro (1 vCPU, 2,5 GHz, dòng bộ xử lý Intel Xeon, 1 GiB RAM) phù hợp với chúng tôi. Với tư cách là người dùng đã đăng ký gần đây, tôi có thể sử dụng loại này miễn phí - được đánh dấu là “Đủ điều kiện sử dụng bậc miễn phí”. Chúng tôi thiết lập Số lượng phiên bản: 2 (số lượng máy chủ ảo).

Sau khi dịch vụ nhắc chúng tôi chạy Khởi chạy phiên bản(máy chủ ảo được định cấu hình), chúng tôi lưu các khóa SSH cần thiết để liên lạc với máy chủ ảo từ bên ngoài. Trạng thái của máy chủ ảo và địa chỉ IP để liên lạc với máy chủ máy tính cục bộ có thể được theo dõi trong bảng điều khiển quản lý.

Điểm quan trọng: trong cài đặt Mạng & Bảo mật / Nhóm bảo mật chúng ta cần tạo một quy tắc sẽ mở các cổng cho các kết nối TCP - điều này cần thiết cho trình quản lý quy trình MPI. Quy tắc có thể trông như thế này:

Loại: Quy tắc TCP tùy chỉnh
Giao thức: TCP
Phạm vi cổng: 1024-65535
Nguồn: 0.0.0.0/0

Vì lý do bảo mật, bạn có thể đặt quy tắc nghiêm ngặt hơn, nhưng đối với bản demo của chúng tôi, điều này là đủ.

Và cuối cùng, một cuộc khảo sát ngắn về các chủ đề có thể xuất bản trong tương lai về điện toán hiệu năng cao.

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. , Vui lòng.

Song song hóa trong ngôn ngữ C
Ví dụ 3b. Song song hóa ở Fortran
Ví dụ 4a. Xác định đặc điểm của bộ đếm thời gian hệ thống bằng ngôn ngữ C
Ví dụ 4b. Xác định đặc điểm hẹn giờ của hệ thống trong Fortran

1.4. Gửi và nhận tin nhắn giữa các tiến trình riêng biệt

1.4.1. Hoạt động điểm-điểm

1.4.2. Gửi và nhận tin nhắn bị chặn

Ví dụ 5a. Trao đổi tin nhắn giữa hai tiến trình trong ngôn ngữ C
Ví dụ 5b. Trao đổi tin nhắn giữa hai tiến trình trong Fortran
Ví dụ 6a. Trao đổi thông điệp giữa các tiến trình chẵn và lẻ trong C
Ví dụ 6b. Trao đổi tin nhắn giữa các tiến trình chẵn và lẻ trong Fortran
Ví dụ 7a. Chuyển tiếp tới một quy trình không tồn tại trong C
Ví dụ 7b. Chuyển tiếp tới một quy trình không tồn tại ở Fortran
Ví dụ 8a. Gửi dữ liệu vào bộ đệm bằng ngôn ngữ C
Ví dụ 8b. Gửi dữ liệu vào bộ đệm bằng ngôn ngữ Fortran
Ví dụ 9a. Lấy thông tin về thuộc tính tin nhắn trong ngôn ngữ C
Ví dụ 9b. Lấy thông tin về thuộc tính tin nhắn trong Fortran
Ví dụ 10a. Định nghĩa độ trễ và thông lượng trong ngôn ngữ C
Ví dụ 10b. Xác định độ trễ và thông lượng trong Fortran

1.4.3. Gửi và nhận tin nhắn mà không bị chặn

Ví dụ 11a. Trao đổi cấu trúc liên kết vòng bằng cách sử dụng các hoạt động không chặn trong C
Ví dụ 11b. Trao đổi cấu trúc liên kết vòng bằng cách sử dụng các hoạt động không chặn trong Fortran
Ví dụ 12a. Sơ đồ giao tiếp "master - Workers" bằng ngôn ngữ C
Ví dụ 12b. Sơ đồ giao tiếp “master – Workers” bằng ngôn ngữ Fortran
Ví dụ 13a. Chuyển vị ma trận trong ngôn ngữ C
Ví dụ 13b. Chuyển đổi ma trận ở Fortran

1.4.4. Yêu cầu tương tác đang chờ xử lý

Ví dụ 14a. Sơ đồ của một phương pháp lặp với trao đổi dọc theo cấu trúc liên kết vòng bằng cách sử dụng các truy vấn trì hoãn trong ngôn ngữ C
Ví dụ 14b. Sơ đồ phương pháp lặp với trao đổi qua cấu trúc liên kết vòng bằng cách sử dụng các truy vấn trì hoãn trong Fortran

1.4.5. Tình huống bế tắc

Ví dụ 15a. Trao đổi cấu trúc liên kết vòng bằng thủ tục MPI_Sendrecv trong ngôn ngữ C
Ví dụ 15b. Trao đổi cấu trúc liên kết vòng bằng thủ tục MPI_SENDRECV trong Fortran

1.5. Tương tác quá trình tập thể

1.5.1. Các quy định chung

1.5.2. Rào chắn

Ví dụ 16a. Mô hình hóa đồng bộ hóa rào cản trong ngôn ngữ C
Ví dụ 16b. Mô hình đồng bộ hóa rào cản ở Fortran

1.5.3. Hoạt động truyền dữ liệu tập thể

1.5.4. Hoạt động toàn cầu

Ví dụ 17a. Mô hình hóa tổng toàn cục bằng sơ đồ nhân đôi và phép toán tập thể MPI_Reduce trong ngôn ngữ C
Ví dụ 17b. Mô hình hóa tổng toàn cục bằng sơ đồ nhân đôi và phép toán chung MPI_Reduce ở Fortran

1.5.5. Hoạt động toàn cầu tùy chỉnh

Ví dụ 18a. Hàm toàn cục tùy chỉnh trong ngôn ngữ C
Ví dụ 18b. Chức năng toàn cầu tùy chỉnh trong Fortran

1.6. Nhóm và người giao tiếp

1.6.1. Các quy định chung

1.6.2. Hoạt động với các nhóm quy trình

Ví dụ 19a. Làm việc với nhóm bằng ngôn ngữ C
Ví dụ 19b. Làm việc với các nhóm ở Fortran

1.6.3. Hoạt động với người giao tiếp

Ví dụ 20a. Phá vỡ một bộ giao tiếp trong C
Ví dụ 20b. Phân vùng một người giao tiếp ở Fortran
Ví dụ 21a. Đánh số lại các tiến trình trong ngôn ngữ C
Ví dụ 21b. Đánh số lại các quy trình ở Fortran

1.6.4. Máy liên lạc

Ví dụ 22a. Sơ đồ thợ chính sử dụng bộ liên lạc bằng ngôn ngữ C
Ví dụ 22b. Mạch Master-worker sử dụng bộ liên lạc ở Fortran

1.6.5. Thuộc tính

1.7. Cấu trúc liên kết ảo

1.7.1. Các quy định chung

1.7.2. Cấu trúc liên kết Descartes

1.7.3. Cấu trúc liên kết đồ thị

Ví dụ 23a. Sơ đồ master-worker sử dụng cấu trúc liên kết đồ thị trong ngôn ngữ C
Ví dụ 23b. Sơ đồ công nhân chính sử dụng cấu trúc liên kết đồ thị ở Fortran

1.8. Gửi các loại dữ liệu khác nhau

1.8.1. Các quy định chung

1.8.2. Các kiểu dữ liệu dẫn xuất

Ví dụ 24a. Sắp xếp lại các cột ma trận theo thứ tự ngược lại trong ngôn ngữ C
Ví dụ 24b. Sắp xếp lại các cột ma trận theo thứ tự ngược lại trong Fortran

1.8.3. Đóng gói dữ liệu

Ví dụ 25a. Gửi dữ liệu đóng gói bằng ngôn ngữ C
Ví dụ 25b. Gửi dữ liệu đóng gói ở Fortran

1.9. đối tượng thông tin

1.9.1. Các quy định chung

1.9.2. Làm việc với đối tượng thông tin

1.10. Kiểm soát quy trình động

1.10.1. Các quy định chung

1.10.2.Tạo các tiến trình

master.c
nô lệ.c
Ví dụ 26a. Sơ đồ thợ chính sử dụng quy trình sinh sản bằng ngôn ngữ C
chủ.f
nô lệ.f
Ví dụ 26b. Sơ đồ công nhân bậc thầy sử dụng quy trình sinh sản ở Fortran

1.10.3. Giao tiếp máy khách-máy chủ

máy chủ.c
khách hàng.c
Ví dụ 27a. Trao đổi dữ liệu giữa máy chủ và máy khách bằng tên công khai bằng ngôn ngữ C
máy chủ.f
khách hàng.f
Ví dụ 27b. Trao đổi dữ liệu giữa máy chủ và máy khách bằng tên công khai bằng ngôn ngữ Fortran

1.10.4. Xóa liên kết quy trình

1.10.5. Ổ cắm truyền thông

1.11. Truyền thông một chiều

1.11.1. Các quy định chung

1.11.2. Làm việc với một cửa sổ

1.11.3. Truyền dữ liệu

1.11.4. Đồng bộ hóa

Ví dụ 28a
Ví dụ 28b
Ví dụ 29a. Trao đổi qua cấu trúc liên kết vòng bằng cách sử dụng liên lạc một chiều trong C
Ví dụ 29b. Trao đổi qua cấu trúc liên kết vòng bằng cách sử dụng liên lạc một chiều ở Fortran
Ví dụ 30a. Trao đổi qua cấu trúc liên kết vòng bằng cách sử dụng liên lạc một chiều trong C
Ví dụ 30b. Trao đổi qua cấu trúc liên kết vòng bằng cách sử dụng liên lạc một chiều ở Fortran

1.12. Giao diện bên ngoài

1.12.1. Truy vấn chung

1.12.2. Thông tin từ trạng thái

1.12.3. chủ đề

1.13. I/O song song

1.13.1. Các định nghĩa

1.13.2. Làm việc với tập tin

1.13.3. Truy cập dữ liệu

Ví dụ 31a. Đọc vào bộ đệm từ một tệp bằng ngôn ngữ C
Ví dụ 31b. Đọc vào bộ đệm từ một tệp ở Fortran
Ví dụ 32a. Đọc tập thể từ một tệp bằng ngôn ngữ C
Ví dụ 32b. Đọc tập thể từ một tập tin ở Fortran

1.14. Xử lý lỗi

1.14.1. Các quy định chung

1.14.2. Trình xử lý lỗi liên quan đến người giao tiếp

1.14.3. Trình xử lý lỗi liên quan đến cửa sổ

1.14.4. Trình xử lý lỗi liên quan đến tệp

1.14.5. Thủ tục bổ sung

1.14.6. Mã lỗi và lớp

1.14.7. Gọi trình xử lý lỗi

Ví dụ 33a. Xử lý lỗi trong ngôn ngữ C
Ví dụ 33b. Xử lý lỗi trong Fortran

Chương 2 Công nghệ lập trình song song OpenMP

2.1. Giới thiệu

2.2. Các khái niệm cơ bản

2.2.1. Biên dịch một chương trình

Ví dụ 34a. Biên dịch có điều kiện trong C
Ví dụ 34b
Ví dụ 34c. Biên dịch có điều kiện ở Fortran

2.2.2. Mô hình chương trình song song

2.2.3. Chỉ thị và thủ tục

2.2.4. Thực hiện chương trình

2.2.5. Thời gian

Ví dụ 35a. Làm việc với bộ tính giờ hệ thống trong C
Ví dụ 35b. Làm việc với bộ tính giờ hệ thống ở Fortran

2.3. Vùng song song và nối tiếp

2.3.1. chỉ thị song song

Ví dụ 36a. Vùng song song trong ngôn ngữ C
Ví dụ 36b. Vùng song song ở Fortran
Ví dụ 37a. Tùy chọn rút gọn trong ngôn ngữ C
Ví dụ 37b. Tùy chọn giảm ở Fortran

2.3.2. Ký hiệu viết tắt

2.3.3. Biến môi trường và thủ tục trợ giúp

Ví dụ 38a. Thủ tục omp_set_num_threads và tùy chọn num_threads trong ngôn ngữ C
Ví dụ 38b. Quy trình omp_set_num_threads và tùy chọn num_threads trong ngôn ngữ Fortran
Ví dụ 39a. Thủ tục omp_set_dynamic và omp_get_dynamic trong ngôn ngữ C
Ví dụ 39b. Thủ tục omp_set_dynamic và omp_get_dynamic trong Fortran
Ví dụ 40a. Các vùng song song lồng nhau trong C
Ví dụ 40b. Các vùng song song lồng nhau ở Fortran
Ví dụ 41a. Hàm Omp_in_parallel trong ngôn ngữ C
Ví dụ 41b. Hàm omp_in_parallel trong ngôn ngữ Fortran

2.3.4. chỉ thị duy nhất

Ví dụ 42a. Tùy chọn chỉ thị duy nhất và hiện tại trong ngôn ngữ C
Ví dụ 42b. Tùy chọn chỉ thị duy nhất và hiện tại ở Fortran
Ví dụ 43a. Tùy chọn copyprivate trong ngôn ngữ C
Ví dụ 43b. tùy chọn copyprivate ở Fortran

2.3.5. chỉ thị chính

Ví dụ 44a. Chỉ thị chính trong ngôn ngữ C
Ví dụ 44b. Chỉ thị chính ở Fortran

2.4. Mô hình dữ liệu

Ví dụ 45a. Tùy chọn riêng tư trong ngôn ngữ C
Ví dụ 45b. Tùy chọn riêng tư ở Fortran
Ví dụ 46a. tùy chọn chia sẻ trong ngôn ngữ C
Ví dụ 46b. Tùy chọn chia sẻ ở Fortran
Ví dụ 47a. tùy chọn riêng tư đầu tiên trong ngôn ngữ C
Ví dụ 47b. tùy chọn riêng tư đầu tiên ở Fortran
Ví dụ 48a. chỉ thị threadprivate trong ngôn ngữ C
Ví dụ 48b. chỉ thị threadprivate ở Fortran
Ví dụ 49a. Tùy chọn Copyin trong ngôn ngữ C
Ví dụ 49b. tùy chọn sao chép ở Fortran

2.5. Phân phối công việc

2.5.1. Song song hóa cấp thấp

Ví dụ 50a. Thủ tục omp_get_num_threads và omp_get_thread_num trong ngôn ngữ C
Ví dụ 50b. Thủ tục omp_get_num_threads và omp_get_thread_num trong Fortran

2.5.2. Vòng lặp song song

Ví dụ 51a. Lệnh for trong C
Ví dụ 51b. Lệnh do ở Fortran
Ví dụ 52a. Tùy chọn lịch trình trong ngôn ngữ C
Ví dụ 52b. tùy chọn lịch trình ở Fortran
Ví dụ 53a. Tùy chọn lịch trình trong ngôn ngữ C