MỤC LỤC
▪ Trong tính toán đồng thời, một chương trình là một chương trình trong đó nhiều tác vụ có thể được thực hiện bất cứ lúc nào. ▪ Trong tính toán xử lý song song, một chương trình là một chương trình trong đó nhiều tác vụ phối hợp chặt chẽ với nhau để giải quyết một vấn đề. Vì vậy, các chương trình xử lý song song và phân tán là đồng thời, nhưng một chương trình như hệ điều hành đa nhiệm cũng đồng thời, ngay cả khi nó được chạy trờn mỏy chỉ cú một lừi, vỡ nhiều tỏc vụ cú thể được thực hiện bất kỳ lỳc nào.
Khụng cú sự phõn biệt rừ ràng giữa cỏc chương trỡnh xử lý song song và phân tán, nhưng một chương trình xử lý song song thường chạy đồng thời nhiều tỏc vụ trờn cỏc lừi gần nhau về mặt vật lý và chia sẻ cựng một bộ nhớ hoặc được kết nối bằng mạng tốc độ rất cao. Các tác vụ có thể được thực thi bởi nhiều máy tính cách nhau một khoảng cách lớn và bản thân các tác vụ đó thường được thực thi bởi các chương trình được tạo độc lập.
▪ Trong điện toán phân tán, một chương trình có thể cần hợp tác với các chương trình khác để giải quyết vấn đề.
▪ Các định nghĩa được đưa ra trong phần nội dung của văn bản và thuật ngữ được định nghĩa được in đậm: Một chương trình xử lý song song có thể sử dụng nhiều lừi. ▪ Chúng tôi sẽ chỉ định cú pháp của lệnh gọi hàm với danh sách đối số cố định bằng cách đưa vào danh sách đối số mẫu. Ví dụ: hàm giá trị tuyệt đối số nguyên, abs, trong stdlib có thể có cú pháp được chỉ định bằng.
Đối với cú pháp phức tạp hơn, chúng ta sẽ đặt nội dung bắt buộc trong dấu ngoặc nhọn < >và nội dung tùy chọn trong dấu ngoặc vuông [ ]. Điều này nói rằng câu lệnh if phải bao gồm một biểu thức được đặt trong dấu ngoặc đơn và sau dấu ngoặc đơn bên phải phải là một câu lệnh.
Để giải quyết vấn đề von Neumann bottleneck cũng như cải thiện hiệu suất CPU, các kỹ sư máy tính và nhà khoa học máy tính đã thử nghiệm nhiều sửa đổi đối với cấu trúc von Neumann cơ bản. Trước khi thảo luận về một số sửa đổi này, trước tiên chúng ta hãy dành chút thời gian để thảo luận về một số khía cạnh của phần mềm được sử dụng trong cả hệ thống von Neumann và các hệ thống hiện đại hơn. Threading cung cấp một cơ chế để các lập trình viên chia chương trình của chúng thành các tác vụ độc lập ít hoặc nhiều với đặc tính là khi một luồng bị chặn, một luồng khác có thể chạy.
Hai trường hợp ngoại lệ quan trọng nhất là chúng sẽ cần bản ghi bộ đếm chương trình của riêng mình và chúng sẽ cần ngăn xếp cuộc gọi riêng để có thể thực thi độc lập với nhau. Nếu một quy trình là luồng thực thi “master” và các luồng được bắt đầu và dừng bởi quy trình đó, thì chúng ta có thể hình dung quy trình đó và các luồng phụ của nó dưới dạng các dòng: khi một luồng được bắt đầu, nó sẽ tách ra khỏi quy trình; khi một luồng kết thúc, nó sẽ tham gia vào quy trình.
Điều này có thể khiến bộ xử lý bị đình trệ trong khi chờ bộ nhớ chậm hơn: bộ xử lý có thể ngừng thực thi các câu lệnh từ chương trình hiện tại cho đến khi dữ liệu hoặc lệnh cần thiết được lấy từ bộ nhớ. Nó khai thác nguyên tắc định vị không gian và thời gian bằng cách chỉ lưu giữ trong bộ nhớ chính những phần hoạt động của nhiều chương trình đang chạy; những phần không hoạt động được giữ trong một khối lưu trữ thứ cấp gọi là không gian hoán đổi (swap space). Các khối này thường được gọi là trang (pages) và do truy cập bộ nhớ phụ có thể chậm hơn hàng trăm nghìn lần so với truy cập bộ nhớ chính nên các trang tương đối lớn - hầu hết các hệ thống đều có kích thước trang cố định hiện nằm trong khoảng từ 4 đến 16 kilobyte.
Do đó, mặc dù chúng ta với tư cách là lập trình viên không trực tiếp kiểm soát bộ nhớ ảo, không giống như bộ nhớ đệm CPU, được xử lý bởi phần cứng hệ thống, bộ nhớ ảo thường được điều khiển bởi sự kết hợp giữa phần cứng hệ thống và phần mềm hệ điều hành. Xử lý song song mức tập lệnh, hoặc ILP, cố gắng cải thiện hiệu suất của bộ xử lý bằng cách có nhiều thành phần bộ xử lý hoặc các đơn vị chức năng (functional units) được thực hiện đồng thời lệnh cắt. Trong khi các hệ thống đa vấn đề động có thể thực hiện các lệnh không theo thứ tự, thì trong các hệ thống thế hệ hiện tại, các lệnh vẫn được tải theo thứ tự và kết quả của các lệnh cũng được thực hiện theo thứ tự.
Mặc dù cách tiếp cận này có khả năng tránh lãng phí thời gian của máy do ngừng hoạt động, nhưng nó có nhược điểm là một luồng đã sẵn sàng thực hiện một chuỗi lệnh dài có thể phải chờ để thực hiện mọi lệnh.
Do đó GPU cần phải duy trì tốc độ di chuyển dữ liệu rất cao và để tránh tình trạng ngừng truy cập bộ nhớ, phụ thuộc rất nhiều vào đa luồng phần cứng; một số hệ thống có khả năng lưu trữ trạng thái của hơn một trăm luồng bị treo cho mỗi luồng thực thi. Trên thực tế, trừ khi lập trình viên áp đặt một số đồng bộ hóa, ngay cả khi bộ xử lý đang thực thi chính xác cùng một trình tự lệnh, tại bất kỳ thời điểm nào chúng có thể thực thi những phát biểu khác nhau. Trong cỏc hệ thống bộ nhớ dựng chung cú nhiều bộ xử lý đa lừi, kết nối cú thể kết nối trực tiếp tất cả các bộ xử lý với bộ nhớ chính hoặc mỗi bộ xử lý có thể có kết nối trực tiếp đến một khối bộ nhớ chính và các bộ xử lý có thể truy cập các khối bộ nhớ chính của nhau thông qua phần cứng đặc biệt được tích hợp trong bộ xử lý.
Hypercube là một kết nối trực tiếp có tính kết nối cao đã được sử dụng trong các hệ thống thực tế, được xây dựng theo cách cảm ứng: Hypercube một chiều là một hệ thống được kết nối đầy đủ với hai bộ xử lý. ▪ Sự kết hợp bộ đệm dựa trên thư mục (Directory-based cache coherence) Trong cỏc mạng lớn, việc phỏt súng rất tốn kộm và việc theo dừi kết hợp bộ nhớ đệm yêu cầu một lần phát mỗi khi một biến được cập nhật. Những người mới sử dụng điện toán song song đôi khi thắc mắc tại sao tất cả các hệ thống MIMD không có bộ nhớ dùng chung, vì hầu hết các lập trình viên nhận thấy khái niệm phối hợp ngầm công việc của các bộ xử lý thông qua cấu trỳc dữ liệu dựng chung hấp dẫn hơn là gửi tin nhắn một cỏch rừ ràng.
Mặt khác, các kết nối bộ nhớ phân tán như hypercube và lưới hình xuyến tương đối rẻ tiền và các hệ thống bộ nhớ phân tán với hàng nghìn bộ xử lý sử dụng các kết nối này và các kết nối khác đã được xây dựng.
Nhiều chương trình song song được phát triển bằng cách phân chia công việc của chương trình nối tiếp giữa các quy trình/luồng và thêm vào "chi phí song song" cần thiết như loại trừ lẫn nhau hoặc giao tiếp. Đối với nhiều bài toán, khi chúng ta tăng kích thước bài toàn, phần "vốn đã nối tiếp" của chương trình giảm kích thước; một phiên bản mang tính toán học hơn của phát biểu này được gọi là định luật Gustafson. Để xem chương trình có khả năng mở rộng hay không, chúng ta tăng số lượng quy trình/luồng lên một hệ số của k và ta muốn tìm hệ số x mà ta cần để nâng bài toán lên kích thước sao cho E không thay đổi.
Nếu chúng ta có thể giữ hiệu suất cố định bằng cách tăng kích thước bài toàn ở cùng tốc độ khi chúng ta tăng số lượng quy trình/luồng thì chương trình được cho là có khả năng mở rộng yếu. Quan trọng hơn, nếu chúng ta chạy nhiều hơn một luồng trên mỗi lừi, hệ thống sẽ phải mất thờm thời gian để lờn lịch và hủy lịch trỡnh cho cỏc lừi, đồng thời điều này sẽ làm tăng thêm thời gian chạy tổng thể.