Khắc phục những sự cố dữ liệu với lập lịch động

Một phần của tài liệu Kiến trúc máy tính tiên tiến (Trang 73 - 82)

KHỐI XỬ LÝ SONG SONG Ở MỨC LỆNH MÁY

2.2. Kết hợp xử lý song song ở mức lệnh máy và giải pháp phần mềm về ILP ILP

2.2.2. Hỗ trợ phần cứng đối với chương trình dịch

2.2.2.2. Khắc phục những sự cố dữ liệu với lập lịch động

Một đường ống lập lịch tĩnh đơn giản dự kiến truy nhập và ban hành các lệnh, trừ khi có một sự phụ thuộc dữ liệu giữa một lệnh đã có trong đường ống và các lệnh tải về mà không thể được ẩn với bỏ qua hoặc chuyển tiếp (chuyển tiếp logic làm giảm độ trễ đường ống có hiệu quả để các độc lập nhất định không gây nguy hại).

Nếu đó là một sự phụ thuộc dữ liệu mà không thể được ẩn, sau đó phát hiện mối nguy hiểm phần cứng làm trì hoãn các đường ống bắt đầu với các lệnh sử dụng kết quả. Không có lệnh mới được lấy hoặc ban hành cho đến khi sự phụ thuộc bị xóa.

Trong phần này, chúng ta khảo sát lập lịch động, trong đó phần cứng lệnh thực hiện sắp xếp lại để giảm trì hoãn trong khi duy trì đường dữ liệu và hành vi ngoại lệ. Lập lịch động cung cấp một số ưu điểm: Nó cho phép xử lý một số trường hợp khi sự phụ thuộc là chưa biết tại thời điểm biên dịch (bởi vì họ có thể bao gồm một tham chiếu bộ nhớ) và nó đơn giản hóa các trình biên dịch. Có lẽ quan trọng nhất, nó cho phép bộ xử lý chịu đựng sự chậm trễ không thể đoán trước như cache nhớ, bằng cách thực hiện mã khác trong khi chờ đợi cho bỏ lỡ để giải quyết. Gần như là quan trọng, lập lịch động cho phép mã đã được biên dịch với một đường ống trong tâm để chạy hiệu quả trên một đường ống khác. Trong mục 2.6, chúng ta khảo sát sự tích lũy phần cứng, một kỹ thuật có lợi thế về hiệu suất đáng kể, xây dựng

trên lập lịch động. Như chúng ta sẽ thấy, những lợi thế của lập lịch động được lợi ích từ sự gia tăng đáng kể chi phí về độ phức tạp của phần cứng.

Mặc dù một bộ xử lý lập lịch động không thể thay đổi dòng dữ liệu, nó sẽ cố gắng để tránh trì hoãn khi có mặt sự phụ thuộc. Ngược lại, lập lịch đường ống tĩnh bởi trình biên dịch (được trình bày tại mục 2.2) sẽ cố gắng để giảm thiểu sự trì hoãn bằng cách tách biệt phụ thuộc lệnh để chúng sẽ không dẫn đến mối nguy hiểm. Tất nhiên, trình biên dịch lập lịch đường ống cũng có thể được sử dụng trên mã lệnh để chạy trên bộ xử lý với một đường ống lập lịch động.

a. Ý tưởng lp lch động

Một hạn chế lớn của các kỹ thuật đường ống đơn giản là chúng sử dụng trong các vấn đề lệnh được phát ra và thực hiện: Các lệnh được phát ra trong các cấp chương trình và nếu một lệnh ngừng trong các đường ống, không có lệnh sau đó có thể tiến hành. Vì vậy, nếu có một sự lệ thuộc giữa hai khoảng cách chặt chẽ các lệnh trong các đường ống, điều này sẽ dẫn đến nguy hiểm và một luồng sẽ cho kết quả. Nếu có nhiều đơn vị chức năng, các đơn vị này có thể nằm nhàn rỗi. Nếu lệnh j phụ thuộc vào một lệnh thực hiện dài i, thực hiện hiện tại trong các đường ống, sau đó tất cả các lệnh sau j phải được ngừng lại cho đến khi i xong và j có thể thực thi.

Ví dụ, hãy xem xét mã này:

DIV.D F0,F2,F4 ADD.D F10,F0,F8 SUB.D F12,F8,F14

Các lệnh SUB.D không thể thực hiện vì sự phụ thuộc của ADD.D trên DIV.D làm cho đường ống đến chậm trễ; nhưng SUB.D dữ liệu không phụ thuộc vào bất cứ điều gì trong các đường ống. Nguy hiểm này tạo ra một giới hạn hiệu suất có thể được loại bỏ bằng cách không có lệnh để thực hiện chương trình theo thứ tự.

Trong các đường ống năm giai đoạn cổ điển, cả cấu trúc và các mối nguy cơ dữ liệu có thể được kiểm tra trong quá trình giải mã lệnh (ID - Instruction Decode):

Khi một lệnh có thể thực hiện mà không có mối nguy hiểm, nó đã được phát từ ID biết rằng tất cả các mối nguy cơ dữ liệu đã được giải quyết.

Để cho phép chúng ta bắt đầu thực hiện các lệnh SUB.D trong ví dụ trên, chúng ta phải tách biệt quá trình phát thành hai phần: kiểm tra các mối nguy hiểm cho bất kỳ cấu trúc và chờ đợi cho sự vắng mặt của một mối nguy hiểm dữ liệu. Vì vậy, chúng ta vẫn còn sử dụng phát lệnh trật tự (tức là, lệnh đã phát trong cấp lệnh chương trình), nhưng chúng ta muốn một lệnh bắt đầu thực hiện ngay sau khi toán hạng dữ liệu của nó có sẵn. Như một đường ống không trật tự thực hiện, trong đó ngụ ý không trật tự hoàn thành.

Không trật tự thực hiện lệnh một khả năng của nguy cơ WAR và WAW, mà không tồn tại trong các đường ống số nguyên năm giai đoạn và nó mở rộng hợp lý cho một đường ống dấu chấm động trong trật tự. Hãy xem xét mã dấu chấm động MIPS trong trình tự sau đây:

DIV.D F0,F2,F4 ADD.D F6,F0,F8 SUB.D F8,F10,F14 MUL.D F6,F10,F8

Có một sự không phụ thuộc giữa ADD.D và SUB.D và nếu đường ống thực hiện các đường ống SUB.D trước ADD.D (mà là chờ đợi cho DIV.D), nó sẽ vi phạm các sự vi phạm không phụ thuộc, hiệu suất gây nguy hiểm WAR. Tương tự như vậy, để tránh vi phạm phụ thuộc xuất, chẳng hạn như viết F6 bởi MUL.D, nguy cơ WAW phải được xử lý. Như chúng ta sẽ thấy, cả hai mối nguy hiểm đều được tránh bằng cách sử dụng thanh ghi đổi tên.

Không thật tự hoàn thành cũng tạo ra các biến chứng lớn trong việc xử lý ngoại lệ. Lập lịch động với không trật tự hoàn thành phải bảo quản hành vi ngoại lệ trong ý nghĩa là chính xác những trường hợp ngoại lệ có thể sẽ phát sinh nếu chương trình được thực hiện trong chương trình nghiêm ngặt để thực sự làm phát sinh. Lập lịch động xử lý bảo quản hành vi ngoại lệ bằng cách bảo đảm rằng không có lệnh có thể tạo ra một ngoại lệ cho đến khi các bộ xử lý biết rằng các lệnh nâng cao ngoại lệ sẽ được thực hiện, chúng ta sẽ thấy ngay cách sở hữu này có thể được bảo đảm.

Mặc dù hành vi ngoại lệ được ngăn ngừa, bộ xử lý lập lịch động sẽ phát sinh những ngoại lệ không chính xác. Một ngoại lệ sẽ không chính xác nếu bộ xử lý rõ khi một ngoại lệ được phát sinh không có cái nhìn chính xác như thể là đường dẫn bị xử lý một cách liên tiếp trong chương trình ra lệnh chính xác. Những ngoại lệ không chính xác có thể xảy ra vì hai khả năng sau:

1. Đường ống có lẽ đã được hoàn tất các kết nối sau đó trong chương trình ra lệnh hơn là đường dẫn trong ngoại lệ.

2. Đường ống có lẽ chưa hoàn tất một vài lệnh trong chương trình ra lệnh sớm hơn là đường dẫn trong ngoại lệ.

Ngoại lệ không chính xác làm nó khó khăn trong việc khởi động lại sự xử lý sau khi một ngoại lệ. Hơn là những vấn đề địa chỉ trong phần này, chúng ta sẽ thảo luận một giải pháp theo đó đưa ra những ngoại lệ chính xác trong hoàn cảnh của một bộ xử lý với sự nghiên cứu trong mục 2.6. Trong dấu chấm động ngoại lệ, những giải pháp khác đã được sử dụng.

Để cho phép hủy lệnh thi hành, chúng ta phân rẽ về bản chất 5 giai đoạn đặt đường ống đơn giản của chúng ta thành hai giai đoạn:

1. Đưa ra – các lệnh giải mã, kiểm tra nguy cơ tạo thành.

2. Đọc toán hạng – chờ cho đến khi không có dữ liệu nguy hại sau đó mới đọc toán hạng.

Một lệnh truy cập các gian đoạn đi trước và có thể truy cập cả hai thành lệnh thanh ghi hay thành một hàng những lệnh trì hoãn; lệnh sau khi được cấp phát từ thanh ghi hay hàng. Giai đoạn EX là giai đoạn đọc toán hạng như là 5 giai đoạn trong đường ống. Thi hành lệnh có thể mất nhiều chu trình, dựa vào quá trình hoạt động.

Chúng ta nhận định sự khác nhau khi một lệnh bắt đầu thi hành và khi nó thực hiện hoàn tất; giữa hai lần, lệnh đang trong quá trình thi hành. Đường ống của chúng ta cho phép nhiều lệnh cùng thực hiện cùng thời gian, không có khả năng này, những thuận lợi chính là lập lịch động biến mất. Việc có nhiều lệnh thực hiện ngay lập tức yêu cầu những đơn vị chức năng, đơn vị chức năng đường ống, hoặc cả hai. Từ hai khả năng này – đơn vị chức năng đường ống và những đơn vị chức năng – thì tương đương cho những mục đích của điều khiển đường ống, chúng ta sẽ giả thiết bộ xử lý có nhiều đơn vị chức năng.

Trong một đường ống lập lịch dộng, tất cả lệnh thông qua vấn đề biểu đạt trong mệnh lệnh; tuy nhiên, chúng có thể bị hư hoặc đi lòng vòng trong giai đoạn hai (đọc toán hạng) và như vậy thực hiện lệnh thoát. Scoreboarding là một kỹ thuật cho phép những lệnh không thi hành lệnh khi có những tài nguyên đủ và không có dữ liệu phụ thuộc; đó là CDC 6600 và có tên scoreboard, với sự phát triển khả năng này. Tại đây chúng tôi tập trung vào một kỹ thuật phức tạp hơn, gọi là giải thuật Tomasulo và là sự nâng cao chính cho scoreboarding.

b. Lp lch động s dng tiếp cn TOMASULO

Đơn vị dấu chấm động IBM 360/91 đang sử dụng là một hệ thống phức tạp để cho phép ngưng thi hành lệnh. Hệ thống này, phát minh bởi Robert Tomasulo, những đường đi khi toán hạng cho các lệnh sẵn có, để giảm thiểu nguy hại RAW, giới thiệu việc đổi thanh ghi, giảm thiểu nguy hại cho WAW và WAR. Có nhiều sự biến đổi trên sơ đồ này trong bộ xử lý hiện đại, mặc dù khái niệm chìa khóa của đường dẫn phụ thuộc cho phép thi hành lệnh ngay khi toán hạng có sẵn và đổi tên thanh ghi để tránh nguy hại cho WAR và WAW là những đặc trưng chung.

Mục đích của IBM là đạt được biểu hiện dấu chấm động cao và đến từ thiết lập đường dẫn và từ những bộ biên dịch thiết kế cho họ máy tính 360, hơn là chuyên môn hóa từ những bộ biên dịnh đặc biệt cho những bộ xử lý cấp cao. Kiến trúc 360 chỉ có 4 bộ thanh ghi dấu chấm động chính xác kép, với giới hạn ảnh

hưởng của bộ lập lịch biên dịch; thực tế đây là cách khác để tiếp cận Tomasulo.

Ngoài ra, IBM 360/91 có những sự truy cập bộ nhớ những sự trì hoãn dấu chấm động dài, giải thuật Tomasulo được thiết kế ra để giải quyết nó. Ở cuối phần này, chúng ta sẽ thấy giải thuật Tomaluso hỗ trợ sự trùng lắp thực thi những sự lặp đi lặp lại của một vòng.

Chúng ta giải thích giải thuật, tập trung vào đơn vị dấu chấm động và đơn vị lưu trữ, trong ngữ cảnh thiết lập đường dẫn MIPS. Sự khác biệt cơ bản giữa MIPS và 360 là sự có mặt của các lệnh bộ nhớ thanh ghi trong kiến trúc mới. Vì những giải thuật của Tomasulo sử dụng đơn vị chức năng tải, không có sự thay đổi có ý nghĩa cần để thêm vào các mẫu địa chỉ bộ nhớ thanh ghi. IBM 360/91 đã có cả đơn vị chức năng đường ống, hơn là những đơn vị nhiều chức năng, nhưng chúng ta mô tả thuật toán như thể là có những đơn vị nhiều chức năng. Đó là những khái niệm mở rộng đơn giản tới đường ống những đơn vị chức năng.

Như chúng ta sẽ thấy, những mối nguy hại cho RAW sẽ tránh được bởi việc thực hiện các lệnh khi những toán hạng của nó sẵn có. Các nguy hại WAR và WAW, xuất hiện từ những sự phụ thuộc tên, sẽ bị loại bỏ bởi thanh ghi đổi tên.

Thanh ghi đổi tên loại bỏ những mối nguy hại bằng việc thay đổi các thanh ghi đến, bao gồm tất cả với việc trì hoãn việc đọc hay ghi cho những lệnh quá sớm, vì thế việc không được phép ghi không ảnh hưởng đến bất kỳ lệnh nào mà phụ thuộc vào giá trị trước đó của một toán hạng.

Để hiểu sâu hơn về việc thanh ghi đổi tên giới hạn được các mối nguy hại WAR và WAW, xem xét chuỗi mã các ví dụ sau bao gồm cả các mối nguy hại tiềm tàng đối với WAR và WAW:

DIV.D F0,F2,F4 ADD.D F6,F0,F8 S.D F6,0(R1) SUB.D F8,F10,F14 MUL.D F6,F10,F8

Có một sự không phụ thuộc giữa ADD.D và SUB.D và sự phụ thuộc đầu ra giữa ADD.D và MUL.D dẫn đến 2 mối nguy hại có thể xảy ra: mối nguy hại cho WAR việc sử dụng F8 bởi ADD.D và một mối nguy hại cho WAW kể từ khi ADD.D có thể kết thúc trễ hơn MUL.D. Có cả 3 sự phụ thuộc dữ liệu đúng; giữa DIV.D và ADD.D, giữa SUB.D và MUL.D, giữa ADD.D và S.D.

Có 2 sự phụ thuộc tên có thể cả hai bị giới hạn bởi thanh ghi đổi tên. Tính đơn giản, giả thiết sự tồn tại của 2 thanh ghi tạm, S và T. Sử dụng S và T, chuỗi có được viết lại hay không cần sự phụ thuộc của:

DIV.D F0,F2,F4 ADD.D S,F0,F8 S.D S,0(R1) SUB.D T,F10,F14 MUL.D F6,F10,T

Ngoài ra, bất kỳ sự sử dụng kế tiếp của F8 phải được thay thế bởi thanh ghi T.

Trong đoạn mã này, việc đổi tên quá trình có thể được thực hiện tĩnh bởi bộ biên dịch. Việc tìm thấy sự sử dụng bất kỳ F8 nào sau đó trong mã yêu cầu hoặc sự phân tích bộ biên dịch phức tạp hoặc hỗ trợ phần cứng, kể từ khi có thể can thiệp vào những nhánh giữa trên đoạn mã này và sự sử dụng F8 sau. Giải thuật Tomasulo có thể được xử lý đổi tên ngang qua những nhánh.

Ở sơ đồ Tomaluso, thanh ghi đổi tên được cung cấp bởi những trạm dự trữ (reservation station), bộ đệm của những toán hạng của lệnh đang đợi để phát. Ý tưởng cơ bản là trạm dự trữ đem về và những bộ đệm ngay khi nó có, loại trừ nhu cầu nhận toán hạng từ thanh ghi. Ngoài ra, những lệnh đang xem xét chỉ định trạm dự trữ mà sẽ cung cấp đầu vào của nó. Cuối cùng, khi những lệnh ghi liên tiếp tới thanh ghi chồng lên nhau thực hiện, chỉ một lệnh cuối cùng thật sự được dùng để cập nhật thanh ghi.

Như những lệnh đã được phát, thanh ghi chỉ rõ những toán hạng đang xem xét được đổi tên tới những tên của trạm dự trữ, mà đã cung cấp thanh ghi đổi tên.

Kể từ khi có nhiều trạm dự trữ hơn những thanh ghi thực sự, kỹ thuật đó có thể loại trừ những mối nguy hại được nảy sinh từ tên những sự phụ thuộc mà đã không thể được loại trừ bởi một bộ biên dịch. Trong khi chúng ta khám phá những thành phần sơ đồ Tomasulo, chúng ta sẽ trở lại đề tài thanh ghi đổi tên và thấy chính xác đổi tên xuất hiện như thế nào và làm sao nó loại trừ mối nguy hại cho WAR và WAW.

Sự sử dụng những trạm dự trữ, hơn tập tin thanh ghi tập trung, dẫn tới hai thuộc tính quan trọng khác. Đầu tiên, phát hiện mối nguy hại và điều khiển thực thi là phân tán: thông tin giữ trong trạm dự trữ tại mỗi đơn vị chức năng xác định khi một lệnh có thể bắt đầu thực thi tại đơn vị kia. Thứ hai, những kết quả được đi trực tiếp qua tới những đơn vị chức năng từ những trạm dự trữ nơi có bộ đệm, hơn là việc đi qua thanh ghi. Việc đi vòng đó được làm với một kết quả chung đường dẫn mà cho phép tất cả các đơn vị đợi một toán hạng để tương thích. Trong những đường ống với nhiều đơn vị thực hiện và phát hành nhiều lệnh trên mỗi xung đồng hồ, nhiều hơn một kết quả đường dẫn cần thiết.

Hình 2.7 cho thấy cấu trúc cơ bản của bộ xử lý cơ bản Tomasulo, bao gồm cả đơn vị dấu chấm động lẫn đơn vị lưu trữ tải; không ai trong số những bảng điều khiển thực hiện được chỉ ra. Mỗi trạm dự trữ giữ một lệnh mà đã được đưa ra và đợi

sự thực hiện tại một đơn vị chức năng và mọi giá trị toán hạng cho lệnh đó, nếu chúng đã có tính toán, hay là những tên của những trạm dự trữ sẽ cung cấp những giá trị toán hạng.

Những bộ đệm tải và những bộ đệm lưu trữ dữ liệu hay những địa chỉ đến và đi đến bộ nhớ và xử lý gần như chính xác giống những trạm dự trữ, vì vậy chúng ta chỉ phân loại chỉ khi cần thiết. Những bộ ghi dấu chấm động được nối bởi một cặp đường dẫn tới những đơn vị chức năng và bởi đường dẫn đơn tới những bộ đệm lưu trữ.

Hình 2.7: Cấu trúc cơ bản của một đơn vị dấu chấm động MIPS đang sử dụng giải thuật Tomasulo. Những lệnh được gửi từ đơn vị lệnh vào trong hàng lệnh từ đó chúng được đưa vào trong lệnh FIFO. Những trạm dự trữ bao gồm những toán hạng và toán hạng thực, cũng như thông tin tốt được sử dụng cho sự phát hiện và giải quyết những mối nguy hiểm. Những bộ đệm tải có ba chức năng: giữ lại những địa chỉ hiệu quả cho đến khi nó được tính toán, theo dõi những sự nạp trên địa chỉ bộ nhớ và giữ lại kết quả của những lần tải được bổ sung đang đợi trên CDB. Tương tự, bộ đệm lưu trữ có ba chức năng: giữ những địa chỉ hiệu quả cho đến khi nó được tính toán, giữ những địa chỉ bộ nhớ đến những phần lưu trữ còn lại mà đang đợi giá trị dữ liệu cất giữ và giữ địa chỉ và giá trị để lưu trữ đến bộ nhớ có sẵn. Tất cả những kết quả từ những đơn vị FP hoặc đơn vị tải được mang trên CDB, mà đi đến thanh ghi tập tin FP cũng như tới trạm dự trữ và bộ đệm lưu trữ. Những địa chỉ FP thực hiện cộng và trừ, những bộ nhân FP làm nhân và chia kết quả từ những đơn vị chức năng và từ bộ nhớ được gửi đến tuyến dữ liệu chung, đi khắp nơi trừ bộ đệm tải.

Một phần của tài liệu Kiến trúc máy tính tiên tiến (Trang 73 - 82)

Tải bản đầy đủ (PDF)

(260 trang)