Professional Documents
Culture Documents
SƠ ĐỒ KHỐI VÀ TẬP LỆNH (N.V.Dũng)
SƠ ĐỒ KHỐI VÀ TẬP LỆNH (N.V.Dũng)
SƠ ĐỒ KHỐI VÀ TẬP LỆNH (N.V.Dũng)
Nhìn vào hình vẽ ta có thể thấy phần bên trên bên trái là tương ứng với khối Front-
Out,phần giữa là tương ứng khối logic Out-Of-Order ,phần dưới là khối xử lí số nguyên
và dấu chấm động và Cache dữ liệu L1.Phần bên phải hình vẽ là khối Memory
subsystem.
A . Front End
Khối Front End bao gồm một số đơn vị như hình vẽ,bao gồm :
- Instruction TLB (ITLB)
- The front-end branch predictor (labeled here Front - End BTB)
- The IA-32 Instruction Decoder
- The Trace Cache
- Micocode ROM
a. Trace Cache
Trace Cache là cache chính hay cache lệnh level 1(L1) đảm nhiệm vận chuyển 3 vi
lệnh mỗi xung nhịp đồng hồ tới khối logic Out-Of-Order Execution.Phần lớn các lệnh
trong chương trình là được nạp và thực hiện từ Trace Cache.Chỉ khi nào miss Trace
Cache thì vi kiến trúc NetBurst mới nạp và giải mã đến các lệnh ở Cache L2.Trace
Cache có khả năng nắm giữ tới 12 vi lệnh, mỗi vi lệnh trong Pentium IV có độ rộng
100-bit nên trong Trace Cache có dung lƣợng 150KB (12288 x 100 /8).Nó có tỷ lệ hit từ 8
đến 16K byte tương tự như các Cache lệnh thông thường.
Các lệnh IA-32 khá rườm rà để giải mã.Mỗi lệnh này có nhiều giá trị và lựa chọn
khác nhau.Khối logic giải mã lệnh(instruction decoding logic) cần phải sắp xếp lại và
chuyển đổi các lệnh phức tạp này thành các vi lệnh đơn giản mà máy có thể hiểu và
thực hiên được.Việc giải mã này sẽ đặc biệt khó khi cố gắng giải mã các lệnh IA 32
phức tạp trong mỗi chu kì xung nhịp đồng hồ khi Pentium IV hoạt động ở mức tần số
xung nhịp đồng hồ cao. Một bộ giải mã IA-32 băng thông cao có khả năng giải mã
nhiều lệnh mỗi nhịp đồng hồ, có nhiều đường ống để làm công việc đó. Khi một nhánh
dự đoán sai, thời gian phục hồi ngắn hơn nhiều nếu máy không giải mã lại tập lệnh IA-
32 cần để tiếp tục thực hiện tại vị trí nhánh mục tiêu . Bằng việc lưu trữ các vi lệnh của
các lệnh đã được giải mã ,vi kiến trúc NetBurst có thể bỏ qua phần lớn thời gian giải
mã lệnh do đó giảm thiểu độ trễ khi miss dự đoán và cho phép việc giải mã trở nên
đơn giản hóa:khi một lệnh được thực thi nhiều lần thì nó sẽ lấy vi lệnh đã được giải
mã sẵn và lưu trong Trace Cache,không cần phải giải mã lại nhiều lần như các bộ VXL
trước nữa. Execution Trace Cache lấy các vi lệnh đã thực sự được giải mã từ bộ giải
mã lệnh IA 32 và lắp ráp hay xây dựng chúng thành một trình tự yêu cầu chương trình
gọi là vết (trace).Cứ 6 vi lệnh thì được gói thành một dòng vết(trace line).Một vết đơn lại
gồm nhiều dòng vết . Những vết này bao gồm các vi lệnh (μops) chạy liên tục xuống
đường dẫn dự đoán của quá trinh thực hiện chương tình.
Trace Cache cũng có riêng 1 cơ chế dự đoán nhánh để chỉ dẫn vị trí tiếp theo trong
Trace Cache cho các lệnh đang được nạp.Cơ chế dự đoán trong Trace Cache
này(trong hình vẽ là BTB Trace) thì đơn giản hơn cơ chế dự đoán của khối Front
End,mục đích chính của nó là dự đoán các nhánh con của chương trình hiện đang
được lưu trữ trong Trace Cache. . Bộ phận dự đoán rẽ nhánh logic gồm 16 lối vào địa
chỉ có tác dụng dự đoán địa chỉ trả lại. Cùng với BTB front-end, BTB Trace
Cache làm giảm tỷ lệ dự đoán nhánh sai khoảng 1 / 3 so với dự đoán nhánh của vi
kiến trúc P6
b. Microcode ROM
Nằm ở gần vị trí Trace Cache là đơn vị Micocode Rom.Rom này được sử dụng cho các
lệnh IA 32 phức tạp như là string move,xử lí lỗi và gián đoạn.Khi gặp phải một lệnh phức
tạp,Trace Cache sẽ chuyển lệnh sang Microcode Rom ,Microcode Rom sẽ cung cấp các
vi lệnh cần thiết có trong nó để hoàn thành hoạt động.Sau khi kết thúc,khối front end sẽ
tiếp tục nạp các các vi lệnh từ Trace Cache.
14
BTB = Branch Target Buffer,nó lưu trữ lịch sử của các nhánh lệnh đã thực hiện
trước đó và mục tiêu thực hiện của chúng để tiết kiệm thời gian tính toán cho ra các
mục tiêu này.
Đơn vị logic nạp (fetch) sẽ luôn cố gắng nạp đầu vào cho đơn vị giải mã là các lệnh
IA 32 tiếp theo mà chương trình sẽ cần thực hiện. Đơn vị Instruction prefetch sẽ được
chỉ đạo từ đơn vị logic branch prediction (đơn vị dự đoán nhánh)(trên hình vẽ chính là
khối Front-End BTB) để biết được lệnh gì sẽ được nạp tiếp theo.Bộ dự đoán nhánh cho
phép bộ xử lí bắt đầu nạp và thực hiện lệnh trước khi kết quả của nhánh trước đó
được biết. Đơn vị dự đoán rẽ nhánh này(branch prediction logic/front - end BTB) có
dung lượng khá rộng lên tới 4K entries ,do đó nó có thể nắm được hầu hết các thông
tin của các nhánh cũ đã thực hiện. Nếu 1 nhánh không tìm thấy ở BTB ,bộ dự đoán rẽ
nhánh dự đoán kết quả của nhánh dựa trên hướng của sự dời chỗ nhánh (tiến hoặc
lùi). Nhánh lùi được cho là được thực hiện và nhánh tiến cho là không thực hiện.
The Istruction Decoder nhận các byte lệnh 32 bit từ Cache L2 64 bit,và giải mã
chúng thành các vi lệnh (uops) mà máy có thể hiểu và thực hiện được.Một bộ giải mã
đơn instruction decoder chỉ có thể giải mã được tối đa là 1 lệnh IA 32 trong 1 chu kì
đồng hồ mà thôi.Một số lệnh IA 32,mỗi lệnh có thể chuyển đổi được thành 1 vi lệnh
đơn,nhưng cũng có nhiều lệnh thì lại mỗi lệnh chuyển đổi được thành nhiều hơn 1 vi
lệnh .Trong trường hợp cần nhiều hơn 4 vi lệnh để hoàn thành giải mã 1 lệnh IA 32 thì
lúc này bộ giải mã sẽ gửi tín hiệu vào trong microcode ROM để lấy các vi lệnh tương
ứng .Tuy nhiê phần lớn các lệnh không cần phải nhảy vào microcode ROM để hoàn
thành giải mã.Ví dụ điển hình về 1 lệnh phức tạp gồm nhiều vi lệnh chúng ta có thể kể
đến lênh string move,lệnh này cần tới hàng nghìn vi lệnh để hoàn thành giải mã nó.
- allocation, renaming.
- scheduling functions.
Khối logic thực thi này có một số bộ đệm để sắp xếp lại trật tự thực hiện các lệnh khi
chúng được đưa vào ống lệnh và được lập lịch thực hiện để có thể thực hiện chương
trình nhanh hơn.Bộ xử lí sẽ cố gắng tìm ra thật nhiều lệnh có thể thực hiện xong chỉ
trong mỗi chu kì và thực hiện chúng kể cả khi chúng không còn sắp xếp theo trình tự
chương trinh gốc nữa.Bằng việc thấy được một lượng lớn các lệnh từ chương trình
cùng lúc ,Out- Of- Order Excution Engine có thể thường xuyên tìm ra nhiều lệnh độc lập
đã sẵn sàng để thực hiện.Vi kiến trúc NetBurst có bộ nhớ đệm sâu hơn so với kiến trúc
P6 giúp cho phép thực hiện được việc này . Nó có thể thực hiện được 126 lệnh tại
cùng 1 thời điểm và có thể thực hiện 48 lệnh nạp và 24 lệnh lưu tại mỗi thời điểm.
- Dành ra một trong 126 reorder buffers (ROB) cho vi lệnh hiện thời. Nó cho phép thực hiện
vi lệnh không theo thứ tự (out-of-order), CPU có thể đặt chúng trở lại thứ tự cũ sử dụng bảng này.
- Dành ra một trong 128 register files (RF) để lƣu trữ kết quả dữ liệu từ xử lí vi lệnh.
- Nếu vi lệnh là nạp (LOAD) hoặc ghi (STORE), có nghĩa là nó sẽ đọc hoặc viết
dữ liệu trên bộ nhớ RAM, nó sẽ dành một trong số 48 bộ đệm nạp (Load Buffers - LB)
hoặc một trong 24 bộ đệm lưu trữ (Store Buffers - SB) tương ứng.
- Dành ra một đầu vào trên bộ nhớ hoặc hàng đợi, tuỳ thuộc vào từng vi lệnh.
Tập lệnh CISC x86 chỉ có 08 thanh ghi 32-bit (EAX, EBX, ECX, EDX, EBP, ESI,
EDI và ESP). Số này đơn giản là quá ít, đặc biệt là khi CPU có thể thực thi theo kiểu
out-of-order. Do đó, CPU phải đổi tên và nội dung của những thanh ghi đƣợc sử
dụng trong chương trình thành một trong 128 thanh ghi của CPU, điều này cho phép
những lệnh sử dụng cùng thanh ghi có thể chạy đồng thời. Thậm trí out-of-order, có
nghĩa là cho phép lệnh thứ hai chạy trước lệnh thứ nhất ngay cả khi chúng sử dụng
cùng một thanh ghi.
Chúng ta cần chú ý rằng Pentium IV thực sự có tới có 256 thanh ghi: 128 cho những lệnh
số nguyên và 128 thanh ghi cho lệnh dấu chấm động và lệnh SSE.
b. Scheduling functions
Scheduler là trái tim của hệ thống out-of-order Pentium IV. Mục đích của
Scheduler là giữ cho mọi execution unit trong CPU luôn luôn làm việc. Các vi lệnh
tới scheduler sẽ đƣợc nó phân tích và đặt vào một trong bốn scheduler unit tùy theo
kiểu của vi lệnh:
- Memory scheduler unit: cho những vi lệnh liên quan đến bộ nhớ. Những vi
lệnh này đến từ hàng đợi của các vi lệnh bộ nhớ (memory microinstruction
queue).
- Fast scheduler unit: cho những vi lệnh đơn giản.
- Slow / General FP scheduler unit: cho những vi lệnh khác và những vi lệnh xử lý
dấu chấm động phức tạp.
- Simple FP scheduler unit: cho những vi lệnh dấu chấm động đơn giản.
Scheduler sắp xếp những vi lệnh theo kiểu của chúng. Sau đó nó có thể gửi mỗi vi
lệnh trực tiếp tới Execution Unit tương ứng để xử lí. Những Execution Unit đƣợc nối
tới Scheduler qua 04 cổng gửi đi (dispatch port) được đánh số từ 0 tới 3, như
hình dưới đây:
Phần chính của Rapid Execution Engine là các rapid execution unit, bao gồm hai
ALU và hai AGU được đánh dấu “clock x2” trên hình vẽ. Các vi lệnh đơn giản có thể
được thực thi bằng những đơn vị này và chỉ mất một nửa xung clock, những lệnh
dịch và xoay không thể đƣợc thực thi được bằng các rapid execution unit sẽ được
gửi đến “Slow ALU”. Cổng 0 và 1 có thể gửi hai vi lệnh trong một xung clock tới 2 rapid
execution ALU, do đó số lƣợng tối đa các vi lệnh có thể đƣợc chuyển đi trong một xung
clock là 6:
- Hai vi lệnh cho cổng 0
- Hai vi lệnh cho cổng 1
- Một vi lệnh cho cổng 2
- Một vi lệnh cho cổng 3
Một điều chúng ta cần nhớ là những lệnh phức tạp có thể cần đến vài xung
clock để xử lí. Ví dụ ở cổng số 1, có một đơn vị xử lý dấu chấm động. Trong khi đơn
vị này đang xử lý một lệnh rất phức tạp mất vài xung clock, cổng 1 sẽ vẫn tiếp tục
nhận các lệnh đơn giản nó và chuyển đến ALU trong khi FPU còn bận. Nếu để ý một
chút, ta thấy Intel đặt vào cùng một cổng một fast unit và một complex (slow) unit. Khi
complex unit còn đang bận tính toán, đơn vị còn lại có thể tiếp tục nhận vi lệnh
từ cổng tương ứng.
Nên, mặc dù tối đa chỉ có 6 lệnh được chuyển, thực sự CPU có thể có đến 7 lệnh cùng
được xử lý một lúc.
b. L1 Cache
Cache dữ liệu Level 1(L1) là một loại cache 8K-byte sử dụng cho cả các lệnh
load,store số nguyên ,dấu phẩy động/SSE.Nó được tổ chức thành 4 đường tập kết hợp
với 64 byte cho mỗi dòng cache (cache line).Nó là cache kiểu write-through,nghĩ là cái gì
mà được ghi vào nó thì sẽ luôn luôn được copy vào L2.Nó có thể thực hiện được 1 lênh
load và 1 lệnh store trong mỗi chu kì đồng hồ.
Độ trễ của hoạt động Load là một khía cạnh quan trọng của hiệu suất bộ vi xử lí.
Điều này đặc biệt đúng đối với các chương trình IA-32 có rất nhiều lệnh Load và các
Store vì số lượng hạn chế của các thanh ghi. Đối với hầu hết các chương trình IA 32 thì cấu
hình tuy nhỏ nhưng rất chậm,cache dữ liệu L1 theo sau bởi cache L2 có độ trễ trung
bình đem lại độ trễ truy nhập load thấp hơn,tuy nhiên hiệu suất lại cao hơn 1 cache L1
to và chậm hơn.
D. Memory Subsystem
Vi xử lí Pentium 4 có một memory subsystem với khả năng nổi bật cho phép ứng
dụng mới, các ứng dụng luồng định hướng bang thong cao như 3D, video, và content
creation. Memory subsystem bao gồm bộ nhớ cache mức 2 và bus hệ thống. Cache
level 2 lưu trữ các dữ liệu không lưu trữ được trong cache L1. Bus hệ thống ngoài
được sử dụng để truy cập main memory khi xảy ra miss ở cache mức 2 hay cũng để
truy cập hệ thống thiết bị I/O.
Bộ nhớ cache mức 2 là bộ nhớ cache 256K-byte mà giữ cả các lệnh bị miss trong
Trace Cache và dữ liệu bị miss trong cache dữ liệu mức 1. Bộ nhớ cache mức 2 được tổ
chức như một bộ 8 đường liên kết với 128 bytes trên một dòng cache. Những
đường cache 128-byte bao gồm 2 phần 64-byte sectors.
Cache L2 của Pentium 4 kết nối với cache dữ liệu L1 qua bus có độ rộng là 256-bit.
Trong các thế hệ vi xử lí trƣớc của Intel độ rộng này là 64-bit. Với một vàiphép toán đơn
giản ta sẽ thấy băng thông giữa cache L2 và nhân là 44.8GB/s vớiPentium 4 ở mức
xung 1.4 GHz và 48GB/s với Pentium 4 ở mức xung 1.5 GHz,nhanh gấp 4 lần so với
thế hệ trước với cùng một xung nhịp.
Cache L2 có các dung lượng có thể có 2-MB/1-MB/256-KB/512-KB
b. Bus hệ thống
Bộ vi xử lí Pentium IV có bus hệ thống với bang thông 3,2 Gbytes mỗi giây.
Băngthông cao là một tạo khả năng quan trọng cho các ứng dụng dòng dữ liệu từ
bộ nhớ.Băng thông này đạt được như vậy là nhờ một bus rộng 64 bit có khả năng
truyền dữ liệu với tốc độ 400MHz.Xung nhịp đồng hồ là 100MHz nhưng nhờ sử dụng
một công nghệ mới gọi là “quad-pumped” mà bus 100 MHz có thể gửi được tới 400
triệu dữ liệu trong một giây.Nó có một phương thức phân chia giao dịch (split-
transaction),ống lệnh sâu(deeply pipeline) cho phép memory subsystem cho phép
chồng chéo lên nhau nhiều yêu cầu đồng thời để thực sự cung cấp bang thông bộ nhớ cao
cho hệ thống thực.
TẬP LỆNH
A. Khuôn dạng lệnh P4
3. x87 FPU
6. SSE
7. SSE2
8. SSE3
Đây là nhóm lệnh tính toán cơ sở mà lập trình viên thường xuyên sử dụng nhất.
Bao gồm:
- Các lệnh truyền dữ liệu (data transfer instructions)
- Các phép tính số học nhị phân (binary arithmetic instructions)
- Các phép tính số học thập phân (decimal arithmetic instructions)
- Các phép tính luận lý (logical instructions)
- Các lệnh dịch và xoay (shift và rotate instructions)
- Các lệnh thao tác trên Bit và Byte (Bit và Byte instructions)
- Các câu lệnh điều khiển (control transfer instructions)
- Các lệnh xử lý chuỗi (string instructions)
- Các lệnh vào ra (I/O instructions)
- Bắt đầu, ra khỏi khối lệnh (enter và leave instructions)
- Điều khiển các cờ (EFLAG)
- Các câu lệnh với thanh ghi đoạn (segment register instructions)
- Các lệnh khác
2. Nhóm lệnh hệ thống (system instruction)
Các lệnh này dùng để hỗ trợ hệ điều hành trong việc điều khiển các chức năng của bộ VXL. Sau đây
là một số lệnh thường gặp:
3. X87 FPU (Floating Point Unit) instructions
The packed arithmetic instructions perform packed integer arithmetic on packed byte,
word, and doubleword integers. (các lệnh này thực hiện việc đóng gói các phép
toán số học thao tác trên số nguyên vào các gói byte, word, doubleword )
PADDB/ PADDW/ PADDD: Add packed byte/word/doubleword integers
PSUBB/ PSUBW/ PSUBD: Subtract packed byte/word/doubleword integers
PMULHW / PMULLW: Multiply packed signed word integers and store
high/low result
PMADDWD: Multiply and add packed word integers
Thực thi các toán tử logic cơ bản AND, NOT, OR, XOR trên các toán hạng
quadword
The shift and rotate instructions shift and rotate packed bytes, words, or
doublewords, or quadwords in 64-bit operands.
( các lệnh này sẽ dịch và quay các byte, word, doubleword hoặc quadword trên các
toán hạng 64-bit).
Một số lệnh:
registers
- Thực thi với toán hạng dấu chấm động có độ chính xác đơn, trên các
Nhóm lệnh này được chia thành các nhóm nhỏ hơn:
thực hiện các phép tính số học giữa các toán tử dấu phảy động có độ chính
xác đơn.một số lệnh
ADDPS: cộng các giá trị số thực dấu phảy động với độ chính xác đơn
Các lệnh so sánh (Comparison Instructions) các lệnh này sẽ so sánh các
toán hạng dấu chấm động có độ chính xác đơn. Ví dụ:
CMPPS: so sánh các giá trị số thực dấu phảy động với độ chính xác đơn
Các lệnh logic (Logical Instructions): các lệnh này sẽ thực thi các toán tử
AND, OR, NOT, XOR trên các toán hạng dấu chấm động có độ chính xác
đơn
Các lệnh chuyển đổi (Conversion Instructions)
c. Double-precision floating-point instructions( các lệnh thực hiện trên các toán
hạng số thực dấu chấm động có độ chính xác kép) bao gồm:
- Di chuyển dữ liệu: di chuyển dữ liệu dấu chấm động có độ chính xác kép
- MOVAPD: di chuyển hai giá trị dấu chấm động có độ chính xác đơn giữa
thanh ghi XMM hoặc giữa thanh ghi XMM và bộ nhớ
- Số học: thực hiện các phép toán cộng/trừ/nhân/chia/tính căn bậc 2/min, max
trên các giá trị số thực dấu chấm động có độ chính xác kép
- ADDPD: cộng các giá trị dấu chấm động có độ chính xác kép
- MULSD: thực hiện phép nhân giá trị dấu chấm động có độ chính xác kép
- So sánh: so sánh các giá trị dấu chấm động có độ chính xác kép
- Chuyển đổi
- CVTPD2PI: chuyển đổi giá trị số thực dấu chấm động có độ chính xác đơn
- Logic: thực hiện các phép toán logic trên các giá trị số thực có độ chính xác
kép
- ANDPD/XOR/NOT/OR: thực hiên phép toán logic AND/XOR/NOT/OR trên
giá trị số thực có độ chính xác kép
- Các lệnh khác (shuffle operations on double-precision floating-point
operands)
- SHUFPD: Shuffles values in packed double-precision floating-point operands
(sắp xếp lẫn lộn các toán hạng)
8. SSE3 instructions
Được phát triển từ thành công của công nghệ MMX (Matrix Math Extensions,
các mở rộng tính toán ma trận) từ thời CPU Pentium MMX, SSE (Streaming SIMD
Extensions, các mở rộng SIMD theo dòng) giờ đây đã được Intel phát triển tới phiên
bản thứ ba (SSE3) cho CPU Prescott với tên mã Prescott New Instructions (PNI, các
lệnh mới Prescott).
SIMD được viết tắt từ Single Instruction, Multiple Data (một lệnh, nhiều dữ liệu). Đó
là một bộ các hoạt động xử lý một cách hữu hiệu những khối lượng lớn dữ liệu song
song với nhau trong kiến trúc máy tính IA-32 (tức kiến trúc 32-bit).
SSE3 với 13 lệnh mới sẽ mở rộng các khả năng của SSE2, cải thiện hoạt động
của công nghệ siêu phân luồng HT cho hiệu quả hơn, tăng cường các chức năng
multimedia và Internet cho hệ thống.
Tập lệnh SSE3 chỉ được thực hiện trên các VXL IA-32 được hỗ trợ phần mở
rộng SSE3.
CPU Prescott có thêm 13 lệnh mới: