Trao đổi dữ liệu sử dụng MPI. Làm việc với thư viện MPI bằng ví dụ về Thư viện Intel® MPI. Tương tác tập thể của các quá trình. Trình xử lý lỗi liên quan đến người giao tiếp

Chú thích: Bài giảng được dành để 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 phát triển chung 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 tiến trình có thể chạy trên bộ xử lý khác nhau, nhưng một số quy trình có thể được đặt trên 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). Các Mã chương trình, được trình bày dưới dạng 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 triển khai 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 năng động số tiến 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.

Có thể được sử dụng để thực hiện các hoạt động ghép nối chế độ khác nhau truyền, 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ố thông 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à các nhóm quy trình và bộ truyền thông hiện có có thể bị xóa. 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 bạn cần chuyển dữ liệu giữa các tiến trình từ các nhóm khác nhau cần phải tạo ra một công cụ giao tiếp 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 bộ 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 chính xác hơn và mô tả ngắn gọn 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 truyền thông 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 thực tế). kênh vật lý giao tiếp 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 thuật toán hiện có. cộng đồng mạng 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 hàng cuối cùng Lưu ý trước khi bắt đầu đánh giá 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; Đặc điểm của việc sử dụng MPI cho thuật toán ngôn ngữ Fortran sẽ được đưa ra trong khoản 5.8.1,
  • Mô tả ngắn gọn về các triển khai có sẵn của thư viện MPI và mô tả chung Môi trường thực thi 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); thuộc tính bổ sung phiên bản tiêu chuẩn 2.0 sẽ được trình bày tại mục 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ả Tính năng bổ sung MPI có thể được làm chủ 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. Cụ thể, theo phong cách này - từ đơn giản đến phức tạp - toàn bộ Tài liệu giáo dục theo MPI.

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à chính văn bản. 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 đứng trước tiền tố MPI, theo sau là một hoặc nhiều từ trong tên, từ đầu tiên trong tên hàm bắt đầu bằng ký tự vốn, 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.

Chỉ có thể khởi chạy ứng dụng MPI trên cụm máy tính thông qua hệ thống xử lý hàng loạt nhiệm vụ. Để đơ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 chú ý là để khởi động 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 một chương trình tính toán song song tích phân xác định từ 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. Chúng 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 quy trình giao tiếp tùy thuộc vào chế độ xử lý dữ liệu.

Ghi chú này hướng dẫn cách cài đặt MPI, kết nối nó với Visual Studio, sau đó sử dụng nó với các tham số đã chỉ định (số lượng nút điện toán). Bài viết này sử dụng Visual Studio 2015, vì... Đây là phiên bản mà học sinh của tôi gặp vấn đề (ghi chú này được học sinh viết cho học sinh), nhưng hướng dẫn có thể cũng áp dụng được cho các phiên bản khác.

Bước 1:
Bạn phải cài đặt HPC Pack 2008 SDK SP2 (trong trường hợp của bạn có thể đã có phiên bản khác), có sẵn trên trang web chính thức của Microsoft. Dung lượng bit của gói và hệ thống phải phù hợp.

Bước 2:
Bạn cần định cấu hình các đường dẫn; để thực hiện việc này, hãy chuyển đến tab Gỡ lỗi - Thuộc tính:

“C:\Program Files\Microsoft HPC Pack 2008 SDK\Include”

Trong trường Thư mục Thư viện:

“C:\Tệp chương trình\Microsoft HPC Pack 2008 SDK\Lib\amd64”

Trong trường thư viện, nếu có phiên bản 32 bit, bạn cần nhập i386 thay vì AMD64.

Msmpi.lib

:

Bước 3:

Để định cấu hình khởi chạy, bạn cần chuyển đến tab Gỡ lỗi và trong trường Lệnh, chỉ định:

“C:\Tệp chương trình\Microsoft HPC Pack 2008 SDK\Bin\mpiexec.exe"

Trong trường Đối số lệnh, hãy chỉ định, ví dụ:

N 4 $(Đường dẫn đích)

Số 4 chỉ số lượng tiến trình.

Để chạy chương trình bạn cần kết nối thư viện

Đường dẫn đến dự án không được chứa chữ Cyrillic. Nếu xảy ra lỗi, bạn có thể sử dụng Microsoft MPI, có sẵn trên trang web của Microsoft.

Để thực hiện việc này, sau khi cài đặt, chỉ cần nhập đường dẫn vào trường Lệnh của tab Gỡ lỗi:

“C:\Tệp chương trình\Microsoft MPI\Bin\mpiexec.exe”

Ngoài ra, trước khi chạy chương trình, đừng quên chỉ ra độ sâu bit của nó:

Ví dụ về chạy chương trình với MPI:

#bao gồm #bao gồm sử dụng không gian tên std; int main(int argc, char **argv) ( int xếp hạng, kích thước; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); cout<< "The number of processes: " << size << " my number is " << rank << endl; MPI_Finalize(); return 0; }

Chạy chương trình trên 2 nút:

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. Một bảng tạm được tạo trong không gian địa chỉ của quá trình gửi bằng một chức năng đặc biệt, được sử dụng trong các hoạt động trao đổi. Hoạt động 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 trao đổi dữ liệu 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 truyền dữ liệu từ bộ đệm buf chứa các phần tử đếm thuộc 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 giao tiếp.

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 thu thập

các giá trị thực hiện xử lý dữ liệu này hoặc xử lý dữ liệu khác (để nhấn mạnh điểm cuối cùng, thao tác này còn được gọi là thao tác 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 làm việc xong 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) ngược lại với 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à thao tác truyền dữ liệu phổ biến nhất (xem Hình 4.6). 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_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 với việc song song hóa các tính toán.

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à 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 tiếp 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 hướng dẫn 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 xuất hiện “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.

  • 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 định, 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 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 thì điều này là đủ.

Và cuối cùng, một cuộc thăm dò ngắn về các chủ đề có thể có cho các ấn phẩm 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.