Tải bản đầy đủ (.pdf) (4 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (179.86 KB, 4 trang )


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


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)



×