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.4. Chi tiết thuật toán tomasulo
Hình 2.10 chỉ ra những sự kiểm tra và những bước mà mỗi lệnh phải đi xuyên qua. Như đã đề cập trước đây, tải và lưu trữ đi thông qua một đơn vị chức năng cho
tính toán địa chỉ có hiệu quả trước khi tới tải độc lập hay các bộ đệm lưu trữ. Tải là bước thực hiện thứ hai tới bộ nhớ truy nhập và sau đó đi đến kết quả ghi và gửi giá trị bộ nhớ đến tập tin thanh ghi và/hoặc bất kỳ trạm dự trữ nào. Lưu trữ hoàn thành sự thực hiện của chúng trong giai đoạn kết quả ghi. Chú ý, tất cả bản ghi trong thanh ghi kết quả, đích đến là thanh ghi hay bộ nhớ. Sự hạn chế này đơn giản hóa giải thuật Tomasulo và có tính quyết định tới hoạt động mở rộng của nó với sự lưu trữ trong mục 2.6.
Hình 2.9: Nhân và chia chỉ là các lệnh chưa hoàn tất.
Giải thuật Tomasulo: Ví dụ trên nền tảng vòng lặp
Để hiểu toàn phần về loại bỏ nguy hại WAW và WAR thông qua sự đổi tên động những thanh ghi, chúng ta phải quan sát vòng lặp. Xem xét chuỗi đơn giản sau đây để nhân những phần tử của một mảng bởi một vô hướng trong F2:
Loop: L.D F0,0(R1) MUL.D F4,F0,F2
S.D F4,0(R1) DADDIU R1,R1,#-8
BNE R1,R2,Loop; branches if R1≠R2
Hình 2.10: Bước vào giải thuật và những điều được yêu cầu cho mỗi bước.
Cho phát lệnh, rd là đích đến, rs và rt là số thanh ghi gốc, imm là dấu hiệu mở rộng khu vực tức thời và r là trạm dự trữ hay bộ đệm mà có lệnh được gán tới. RS là trạm dự trữ cấu trúc dữ liệu. Giá trị được trả về bởi một đơn vị FP hay bởi đơn vị tải được gọi là kết quả. RegisterStat là trạng thái thanh ghi cấu trúc dữ liệu. Khi một lệnh được phát ra, thanh ghi đích đến có trường Qi của nó được thiết lập đến số của bộ đệm hay trạm dự trữ mà lệnh được phát ra. Nếu những toán hạng sẵn sàng trong những thanh ghi, chúng được cất giữ trong trường V. Cách khác, trường Q được đặt ra để báo tới trạm dự trữ nơi sẽ sản xuất những giá trị cần như những toán hạng gốc. Một lệnh đợi ở trạm dự trữ cho đến khi cả hai toán hạng của nó tồn tại, chỉ thị bởi số không trong trường Q. Trường Q thì được cài đặt đến chữ số không hoặc khi lệnh này được phát ra, hay khi một lệnh mà trên đó lệnh này phụ thuộc hoàn thành và được viết lại. Khi một lệnh hoàn tất thực hiện và CDB sẵn sàng, nó có thể được viết lại. Tất cả những bộ đệm, những thanh ghi và trạm dự trữ mà giá trị của Qj hay Qk thì giống như là hoàn thành trạm dự trữ cập nhật những giá trị của nó từ CDB và đánh dấu trường Q để chỉ báo những giá trị đã được nhận. Sau đó, CDB có thể quảng bá kết quả của nó tới nhiều đích đến trong một chu kỳ xung đơn và nếu những lệnh đang đợi có những toán hạng của chúng, chúng có thể bắt đầu thực hiện tất
cả trên chu kỳ xung kế tiếp. Lưu ý rằng đó là hành vi ngăn ngừa ngoại lệ, những lệnh không được cho phép để thực hiện nếu một nhánh làm sớm hơn trong chương trình thứ tự chưa được hoàn thành. Vì bất kỳ khái niệm nào của chương trình ra lệnh không được đề cập sau giai đoạn phát, sự hạn chế này thông thường được thực hiện bởi ngăn ngừa bất kỳ lệnh nào rời bỏ bước phát, nếu có một nhánh đang xem xét đã trong đường ống.
Nếu chúng ta dự đoán những nhánh được lấy, sử dụng trạm dự trữ sẽ cho phép nhiều thực hiện của vòng lặp này để tiến hành ngay lập tức. Ưu điểm này là được độ lợi mà không thay đổi mã - trong hiệu ứng, vòng đang được mở ra động bởi phần cứng sử dụng trạm dự trữ đạt được bởi đổi tên để hành động như thanh ghi bổ sung.
Chúng ta hãy cùng giả sử phát tất cả các lệnh trong hai vòng lặp, nhưng không gì của dấu chấm động tải - lưu trữ hay thao tác được hoàn thành. Hình 2.11 cho thấy trạm dự trữ, những bảng tình trạng thanh ghi và bộ đệm tải và lưu trữ tại điểm này.
(Thao tác ALU số nguyên được bỏ qua và nó được giả thiết nhánh dự đoán như được lấy). Một lần hệ thống đạt đến trạng thái này, hai sự sao chép của vòng đã có thể duy trì với một CPI gần đến 1, được cung cấp những nhân có thể hoàn thành trong 4 chu kỳ xung đồng hồ. Với một sự tiềm ẩn của 6 chu trình, bổ sung những sự lặp sẽ cần để xử lý trước khi trạng thái ổn định có thể đạt được. Khi mở rộng với nhiều lệnh được phát ra, cách tiếp cận Tomasulo có thể chịu đựng nhiều hơn một lệnh mỗi xung.
Nạp và lưu trữ có thể an toàn được làm không cần lệnh, cung cấp cho chúng địa chỉ truy nhập khác nhau. Nếu truy nhập nạp và lưu trữ cùng địa chỉ, sau đó:
• Nạp thì trước lưu trữ trong chương trình ra lệnh và trao đổi các kết quả của chúng trong một nguy hại WAR, hay
• Lưu trữ thì trước nạp trong chương trình ra lệnh và trao đổi các kết quả của chúng trong một mối nguy hại RAW.
Tương tự, trao đổi hai lưu trữ đến cùng địa chỉ kết quả tại mối nguy hiểm WAW.
Từ đây, xác định phải chăng nạp có thể được thực hiện vào một thời gian đã cho, bộ xử lý có thể kiểm tra liệu có phải bất kỳ lưu trữ chưa đầy đủ nào mà khởi đầu nạp chương trình ra lệnh chia sẻ cùng địa chỉ bộ nhớ dữ liệu như là tải. Tương tự, một lưu trữ phải đợi cho đến khi không thi hành nạp hay lưu trữ mà trước đó trong chương trình ra lệnh và chia sẻ cùng địa chỉ bộ nhớ dữ liệu. Chúng ta cho rằng một phương pháp là loại trừ sự hạn chế này trong mục 2.9.
Để phát hiện ra những mối nguy hiểm như vậy, bộ xử lý phải có tính toán địa chỉ bộ nhớ dữ liệu liên quan đến bất kỳ thao tác bộ nhớ ban đầu nào. Đơn giản, nhưng không tất yếu tối ưu, cách để đảm bảo rằng bộ xử lý có tất cả các địa chỉ như vậy thì thực hiện tính toán địa chỉ hiệu quả trong chương trình.
Hình 2.11: Hai hoạt động lặp lại của vòng lặp không có lệnh chưa được hoàn thành.
Những mục nhập trong nhiều trạm dự trữ cho thấy rằng các tải nổi bật là các nguồn. Các trạm dự trữ lưu trữ cho thấy rằng các đích là nguồn của giá trị để lưu trữ.
Hãy xem xét trạng thái tải đầu tiên. Nếu chúng ta thực hiện tính toán địa chỉ hiệu quả theo thứ tự chương trình, sau đó khi nạp một địa chỉ hiệu quả đã hoàn thành, chúng ta có thể kiểm tra xem liệu có một cuộc xung đột địa chỉ nào không bằng cách kiểm tra trường A của tất cả các bộ đệm lưu trữ hoạt động. Nếu địa chỉ tải khớp với địa chỉ của bất kỳ mục hoạt động nào trong vùng đệm lưu trữ, mà lệnh tải không được gửi đến bộ đệm tải cho đến khi hoàn thành xung đột ở lưu trữ.
Việc lưu trữ cũng hoạt động tương tự, ngoại trừ bộ xử lý phải kiểm tra xem có xung đột ở cả các vùng đệm tải và các bộ đệm lưu trữ, khi đó những lưu trữ xung đột không thể được sắp xếp lại với quá trình tải hoặc lưu trữ.
Một đường ống lập lịch động có thể mang lại hiệu suất rất cao, cung cấp các nhánh chính xác như đã dự đoán - một vấn đề chúng ta đã đề cập trong phần trước.
Hạn chế lớn của phương pháp này là sự phức tạp của biểu đồ Tomasulo, đòi hỏi một
lượng lớn phần cứng. Đặc biệt, mỗi trạm dự trữ phải có một bộ đệm kết hợp, phải chạy ở tốc độ cao, cũng như điều khiển logic phức tạp. Hiệu suất cũng vì thế mà bị giới hạn bởi các CDB đơn. Mặc dù các CDB có thể được bổ sung thêm, nhưng mỗi CDB phải tương tác với mỗi trạm dự trữ và phần cứng phối hợp sẽ cần phải được nhân đôi ở mỗi trạm cho mỗi CDB.
Trong biểu đồ Tomasulo có hai kỹ thuật khác nhau được kết hợp: việc đổi tên trong những kiến trúc thanh ghi cho một tập lớn hơn của những thanh ghi và bộ đệm của toán hạng nguồn từ các tập tin thanh ghi. Nguồn toán hạng đệm WAR giải quyết những mối nguy hiểm phát sinh khi các toán hạng có sẵn trong thanh ghi. Nó cũng có thể để loại trừ các rủi ro của WAR bằng cách đổi tên thanh ghi đi kèm với đệm kết quả cho đến khi không có tham chiếu nổi bật với phiên bản trước đó của thanh ghi còn lại. Cách tiếp cận này sẽ được sử dụng khi chúng ta thảo luận về dự trữ phần cứng.
Biểu đồ của Tomasulo không phổ biến trong vài năm sau đó, nhưng đã được chấp nhận rộng rãi trong việc xử lý nhiều vấn đề bắt đầu vào những năm 1990 vì nhiều lý do:
1. Nó có thể đạt được hiệu suất cao mà không đòi hỏi người biên dịch có mã đích vào một cấu trúc đường ống cụ thể, tính chất quý báu trong thời đại của phần mềm thu nhỏ trong lòng thị trường đại chúng.
2. Mặc dù thuật toán của Tomasulo được thiết kế trước cache, nhưng sự hiện diện của cache, với sự chậm trễ vốn dĩ không thể đoán trước, đã trở thành một trong những động lực chính cho lập lịch động. Trật tự thực hiện cho phép bộ vi xử lý được tiếp tục thực hiện các lệnh trong khi chờ đợi hoàn thành một bộ nhớ cache bị trễ, do đó ẩn tất cả hay một phần của bộ nhớ cache trễ bị lỗi.
3. Như bộ vi xử lý trở thành tích cực hơn trong vấn đề khả năng của mình và nhà thiết kế liên quan đến việc tối ưu các đoạn mã ở các biểu đồ khó lập (như hầu hết mã nonnumeric), các kỹ thuật chẳng hạn như đổi tên thanh ghi và lập lịch động trở nên quan trọng hơn.
4. Bởi vì lập lịch động là một thành phần quan trọng của sự nghiên cứu, nên nó đã được thông qua cùng với sự nghiên cứu phần cứng vào những năm giữa của thập niên 1990.