Tutorials Vbook v0.1-Thủ Thuật UDS part 50 pdf

4 174 0
Tutorials Vbook v0.1-Thủ Thuật UDS part 50 pdf

Đang tải... (xem toàn văn)

Thông tin tài liệu

3. Cấu trúc pipeline dài khi xử lý những lệnh độc lập thì ưu việt hơn cấu trúc pipeline ngắn do số lệnh được xử lý đồng thời nhiều hơn. Tuy nhiên không phải toàn bộ lệnh được xử lý đều là những lệnh độc lập, mà còn một phần khá lớn những lệnh phụ thuộc. Đơn giản nhất là những lệnh trong thuật toán xoay vòng: phép tính sau phải chờ kết quả của phép tính ngay trước mới có thể thực hiện. Đây chính là điểm yếu của kiến trúc pipeline dài. Khi lệnh trước (vd lệnh 1) được thực hiện ở bậc n+1 của pipeline, lệnh kế sau nó (vd lệnh 2) đã được nạp vào và thực hiện ở bậc n, nhưng nếu lệnh 2 là phụ thuộc kết quả của lệnh 1, thì mặc dù lệnh 2 này vẫn được nạp vào pipeline nhưng nó vẫn không hề được xử lý. Sau khi lệnh 1 xử lý xong, ra kết quả, toàn bộ lệnh trong pipeline hiện thời dù đang được xử lý ở bậc nào đều phải "tống ra ngoài" để nạp lệnh 2 lại từ bậc đầu tiên. Quá trình thải - nạp - xử lý lại này mất rất nhiều thời gian (có 10bậc thì chỉ phải thải, nạp và xử lý lại 10 lệnh, còn có 30 bậc thì ), nên đây chính là nhược điểm lớn của cấu trúc pipeline dài, tuỳ vào từng soft, nhược điểm này sẽ cân bằng, lớn hơn, hoặc nhở hơn so với ưu điểm nói trên. Chính do trong một tập lệnh có sự tồn tại của cả những lệnh độc lập và phụ thuộc, nên trong CPU mới cần bộ tiên đoán nhánh BPU. BPU làm nhiệm vụ tiên đoán xem lệnh nào là phụ thuộc, độc lập, và xếp thứ tự chúng sao cho việc xử lý có lợi nhất. VD pipeline có 20 bậc thì 2 lệnh phụ thuộc nhau sẽ được xếp cách nhau 19 lệnh khác. lúc đó khi lệnh trước vừa xử lý xong ở bậc thứ 20 thì kết quả của nó sẽ được chuyển ngay đến lệnh phụ thuộc kế sau nó vừa được nạp vào bậc 1, và 19 lệnh xen giữa 2 lệnh này vẫn được xử lý bình thường. Về BPU thì AMD K8 hơn hẳn P4 Thực ra, cũng có một giải pháp được đưa ra để khắc phục nhược điểm khi xử lý các lệnh phụ thuộc trong cấu trúc pipeline dài, đó là sử dụng vùng đệm đích rẽ nhánh BTB. Khi phát hiện ra 2 lệnh phụ thuộc nhau lại được xử lý kế tiếp nhau trong pipeline, trong quá trình tống các lệnh khác ra khỏi pipeline như đã nói ở trên để nạp lại lệnh 2, các lệnh này sẽ được chuyển sang BTB, và được lưu giữ lại toàn bộ trạng thái hiện thời như kết quả giải mã, vị trí trong pipeline. Khi nạp lại vào pipeline để xử lý, các lệnh này sẽ không phải xử lý lại từ đầu mà sẽ xử lý đúng kết quả và vị trí mà nó đã tồn tại trước khi bị tống ra ngoài. Tuy nhiên phương pháp này chỉ làm giảm bớt chút ít chứ không thể khắc phục được hoàn toàn nhược điểm của long pipeline 4. Bro ThangMMM chỉ ra khá chính xác vì sao kiến trúc pipeline dài lại bất lợi hơn kiến trúc pipeline ngắn; chứ nói "mỗi lần thực hiện instruction CPU có khả năng phải truy xuất thông tin trong cache và trong bộ nhớ trung tâm , pipeline càng nhiều tầng thì thời gian truy xuất càng dài dẫn đến việc IPC bị giảm đi" thì không được đúng cho lắm. Một điểm nữa chưa thấy ai đề cập đến: tại sao kiến trúc pipeline dài lại có thể reach được clockspeed cao hơn kiến trúc pipeline ngắn? Có thể hiểu nôm na rằng pipeline càng dài thì mỗi stage để xử lý 1 instruction càng làm ít việc. Từ đó, mỗi stage của kiến trúc này đơn giản hơn mỗi stage của kiến trúc pipeline ngắn rất nhiều. Do đó mà nó có thể có được clockspeed cao hơn kiến trúc pipeline ngắn rất nhiều (ít nhất là trên lý thuyết). 5. Cái này chắc ko sai , mình có đọc được trong 1 bài trên net http://www.behardware.com/articles/623-2/intel-core-2-duo-test.html pipeline càng nhiều tầng thì độ trễ khi truy xuất vào cache hoặc vào Ram càng lớn , từ đó dẫn đến xét tổng quát thì số IPC giảm đi. Có thể đó chỉ là 1 trong các lí do nhưng mình nghĩ IPC giảm là đúng , vì nếu kiến trúc pipeline dài mà số IPC lại tăng nữa thì ko logic > cứ việc tăng stage pipeline lên là giải quyết vẫn đề cái này chắc là do sự tiên đoán rẽ nhánh (hay predilection gì đó ) trở nên phức tạp khi pipeline dài như bro ThangMMM vừa nói , cũng chính vì thế mà với netburst cache L2 lúc nào cũng quan trọng , xeon còn có cả L3 6. Trong việc tiên đoán lệnh, AMD K8 mạnh hơn P4 vì nhiều lí do. Lí do đầu tiên chính là từ "phong cách" làm việc của CPU K8. CPU K8 làm việc ở xung rất thấp so với P4 nên để có hiệu năng ngang ngửa, hiệu suất trên mỗi xung của K8 phải lớn hơn so với P4. Để đạt đựơc hiệu suất cao, AMD đã đầu tư rất nhiều để cải tiến và nâng cấp bộ tiên đoán nhánh. Còn intel cũng có BPU, nhưng khả năng của BPU intel kém xa AMD do intel chủ trương tăng clock lên để khắc phục nhược điểm của BPU Nói chi tiết hơn một chút về BPU thì như sau: Cơ chế xử lý lệnh của CPU: lệnh được tìm và nạp vào hệ thống đường ống của đơn vị thực hiện lệnh từ bộ đệm lệnh ( L1 Instruction Cache ). Lệnh này thông qua các bước như nhận lệnh, giải mã lệnh 1, giải mã lệnh 2 v.v trong đường ống ( hệ thống đường ống có bao nhiêu "bậc" thì sẽ có bấy nhiêu tiến trình mà lệnh cần phải được thực hiện) sẽ đến đơn vị thực hiện lệnh ( Execute Unit), chính là các ALUs. Sau khi ALU đã thực hiện xong lệnh, kết quả của lệnh này sẽ được nạp vào bộ đệm dữ liệu (L1 Data Cache). Có hai loại lệnh chính, đó là lệnh độc lập và các lệnh phụ thuộc. Lệnh độc lập là những lệnh mà kết quả của chúng sau khi xử lý xong có thể được xuất ngay ra đơn vị khác, còn các lệnh phụ thuộc thì kết quả của lệnh trước sau khi được xử lý xong lại được nạp lại vào hệ thống đường ống một lần nữa, đóng vai trò chỉ thị/dữ liệu của lệnh tiếp theo. Mặt khác, bộ xử lý AMD64 có kiến trúc thực thi lệnh song song-liên tiếp (superscalar architechture), nghĩa là đơn vị thực hiện lệnh của nó bao gồm nhiều ALU ( 3 ALUs), và trong các đường ống thì các quá trình xảy ra kế tiếp nhau đối với các lệnh ( tức là khi lệnh thứ nhất đang trong công đoạn x thì lệnh thứ hai đã được nạp vào và thực hiện trong công đoạn x- 1 ). Chính vì các ALU thực thi lệnh song song, tức là đồng thời với nhau, nên chúng chỉ có thể thực thi đồng thời các lệnh độc lập chứ không thể thực thi đồng thời các lệnh phụ thuộc. Hãy thử tưởng tượng: lệnh x và lệnh y là hai lệnh phụ thuộc, trong đó lệnh y cần phải có kết quả của lệnh x mới có thể tiến hành thực hiện, nhưng chúng lại được đồng thời nạp vào hai ALU khác nhau của Execute Unit. Như vậy đối với ALU thực hiện lệnh x sẽ không có vấn đề gì, nhưng với ALU thực hiện lệnh y thì nó sẽ phải chờ kết quả của lệnh x được thực hiện bởi ALU kia gửi sang, và điều đó có nghĩa trong khi ALU thứ nhất đang làm việc với lệnh x thì ALU thứ hai lại "nghỉ ngơi" để chờ kết quả từ ALU kia (nếu xét kỹ hơn thì ALU thứ hai ko hề "nghỉ ngơi" mà nó vẫn làm việc. Nó sẽ cất lệnh y này lại tại một vùng đệm đặc biệt, sau đó nó tìm và nạp vào một lệnh khác để xử lý, sau khi đã có kết quả của lệnh x từ ALU thứ nhất thì nó lại nạp lệnh y này lại và tiến hành xử lý, tuy nhiên điều này cũng làm giảm tốc độ của hệ thống rất nhiều vì ALU phải xoá toàn bộ lệnh đã nạp trong đường ống và tiến hành nạp lại từ đầu 1 lệnh khác). Hơn thế nữa, thời gian để kết quả của lệnh x đi từ ALU thứ nhất sang ALU thứ hai cũng lâu hơn để nó quay trở lại chính ALU thứ nhất, nên tóm lại, khi các lệnh phụ thuộc nhau lại được tiến hành đồng thời trong các ALU độc lập nhau thì tốc độ sẽ giảm đi rất nhiều. Để có thể tránh hiện tượng này, điều quan trọng là trong bộ xử lý phải có một đơn vị phân tích các lệnh đang được lưu trữ trong bộ đệm lệnh, xem lệnh nào là lệnh độc lập, lệnh nào là lệnh phụ thuộc. Các lệnh độc lập sẽ được bố trí để chúng có thể cùng một lúc đi vào các ALU khác nhau, còn các lệnh phụ thuộc thì lại được bố trí để đi vào cùng 1 ALU, và các lệnh cần phải có kết quả từ lệnh trước sẽ được xếp ở sau. Đơn vị phân tích này chính là bộ tiên đoán nhánh - Branch Prediction Unit. Có hai điểm cần lưu ý đối với bộ tiên đoán nhánh trong bộ xử lý AMD64, thứ nhất: mặc dù đã được cải tiến nhiều, nhưng bản chất của bộ tiên đoán nhánh vẫn là "tiên đoán" (do trong giai đoạn lệnh đang ở trong bộ đệm lệnh chúng vẫn chưa được giải mã chính xác nên việc phân loại lệnh độc lập- lệnh phụ thuộc và sắp xếp lệnh chỉ mang tính chất tương đối) nên không thể tránh khỏi hoàn toàn hiện tượng nêu trên, và thứ hai là do bộ tiên đoán lệnh được cải tiến, nên chúng cần phải phân tích rất nhiều lệnh mới đạt được hiệu suất tối ưu, và do đó bộ đệm lệnh ( L1 Instruction Cache) cũng như bộ đệm dữ liệu ( L1 Data Cache) được thiết kế lớn hơn nhiều so với các bộ đệm L1 ở thế hệ AMD K7 và P4 Anh hưởng của số tầng Pipelines lên sức mạnh Cpu Mở hàng 1 thread đóng góp cho Voz cái Bài viết do tui tổng hợp từ mấy bài viết trên web nước ngoài , viết theo lối nôm na dễ hiểu , có sai sót gì mời các bạn vào bình luận (bài đã post trên amtech)

Ngày đăng: 03/07/2014, 04:20

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan