You are on page 1of 61

BỘ CÔNG THƯƠNG

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HCM


KHOA CÔNG NGHỆ ĐIỆN TỬ

Kiến trúc máy tính


Chương 4 _Bộ xử lý

GV : Ths.Nguyễn Thanh Đăng


4.1 GIỚI THIỆU

4.2 MÔ HÌNH THỰC THI LỆNH

4.3 CÁC THÀNH PHẦN CƠ BẢN


CỦA 1 BỘ XỬ LÝ
4.1. Giới thiệu
Có 2 dạng hiện thực khác nhau của máy tính theo kiến trúc MIPS.
1.Single-cycle MIPS: Đây là dạng máy tính đơn chu kỳ, tức là mỗi lệnh chỉ
cần thực hiện trong một chu kỳ. Với dạng này, các thành phần của CPU như
bộ điều khiển (control unit), bộ nhớ và bộ xử lý (ALU) được kết nối trực tiếp
với nhau. Tuy nhiên, dạng này có một số hạn chế, bao gồm tốc độ thực thi
chậm và không tận dụng được tài nguyên của máy tính.

1.Multi-cycle MIPS: Đây là dạng máy tính đa chu kỳ, tức là mỗi lệnh sẽ được
thực hiện trong nhiều chu kỳ. Với dạng này, các thành phần của CPU được
chia ra thành nhiều bước thực hiện khác nhau, từ đó tăng tốc độ thực thi lệnh
và tận dụng tối đa tài nguyên của máy tính. Tuy nhiên, dạng này cũng có
nhược điểm là khó lập trình và có độ phức tạp cao hơn so với dạng đơn chu
kỳ.
4.2. Mô hình thực thi lệnh
Mô hình thực thi lệnh MIPS (Microprocessor without Interlocked Pipeline
Stages) bao gồm các bước thực hiện như sau:

1. Fetch: Bước này máy tính sẽ lấy lệnh từ bộ nhớ để thực thi. Máy tính sẽ sử
dụng con trỏ lệnh (program counter - PC) để định vị vị trí của lệnh trong bộ nhớ.

2. Decode: Sau khi lệnh được lấy ra từ bộ nhớ, nó sẽ được giải mã (decode) để xác
định các thành phần của lệnh như loại lệnh (opcode), các thanh ghi đích (destination
registers), các thanh ghi nguồn (source registers) và giá trị số nguyên liên quan.
3. Execute: Bước này, máy tính sẽ thực hiện lệnh. Thực hiện bao gồm việc tính toán giá
trị của lệnh, chuyển dữ liệu giữa các thanh ghi, kiểm tra điều kiện, lưu trữ giá trị vào bộ
nhớ hoặc truyền giá trị tới các bộ phận khác trong máy tính..
4.2. Mô hình thực thi lệnh

4. Memory: Nếu lệnh yêu cầu truy cập bộ nhớ, bước này sẽ được thực hiện. Máy tính
sẽ truy cập bộ nhớ để lấy hoặc lưu trữ dữ liệu.

5. Write back: Bước này sẽ lưu kết quả của lệnh vào thanh ghi nếu cần thiết. Nếu lệnh
không thay đổi các giá trị trong thanh ghi, bước này sẽ được bỏ qua.

Sau khi hoàn thành bước Write back, con trỏ lệnh (PC) sẽ được cập nhật để trỏ tới lệnh
tiếp theo. Việc thực hiện các bước trên được lặp đi lặp lại cho đến khi kết thúc chương
trình.
4.3. Các thành phần cơ bản của một bộ xử lý

4.3.1. Đường dữ liệu

4.3.2. Bộ điều khiển


4.3. Các thành phần cơ bản của một bộ xử lý

Quá trình thực thi các lệnh MIPS dù theo mô hình đơn giản
hay mô hình xử lí ống thì bộ xử lý theo kiến trúc MIPS
cũng sẽ cần những thành phần cơ bản bao gồm:
Bộ nhớ lệnh,
Tập thanh ghi,
Khối ALU
và bộ nhớ dữ liệu.
4.3. Các thành phần cơ bản của một bộ xử lý
4.3.1. Đường dữ liệu

Đường truyền dữ liệu bao gồm các tín hiệu dữ liệu


(datasignal) và các khối chức năng (functional unit) xử lí
các tín hiệu dữ liệu này. Nhiệm vụ chính của đường dữ
liệu là xử lí dữ liệu dưới sự điều khiển của bộ điều khiển
và truyền dữ liệu qua lại giữa các khối chức năng.
4.3.1. Đường dữ liệu
Bộ nhớ
lệnh

Khối Đường Tập thanh


ALU dữ liệu ghi

Bộ nhớ dữ
liệu
4.3.1. Đường dữ liệu
- Bộ nhớ lệnh:
Bộ nhớ lệnh (instruction memory) là một thành
phần quan trọng của bộ vi xử lý (CPU) trong kiến
trúc MIPS (Microprocessor without Interlocked
Pipeline Stages). Bộ nhớ lệnh chứa các lệnh
(instruction) mà CPU cần thực thi.
Bộ nhớ lệnh trong kiến trúc MIPS được tổ chức
dưới dạng một mảng các lệnh có độ dài cố định
là 32 bit. Mỗi lệnh được lưu trữ dưới dạng nhị
phân trong một ô nhớ liên tiếp trong bộ nhớ lệnh.
Để thực thi một chương trình, CPU sẽ lấy các
lệnh từ bộ nhớ lệnh và thực thi chúng theo thứ tự
tuần tự.
4.3.1. Đường dữ liệu
- Bộ nhớ lệnh:

MIPS sử dụng một bộ đếm chương trình (program counter - PC) để lưu trữ địa chỉ của lệnh
tiếp theo cần được thực thi. Mỗi khi một lệnh được thực thi, giá trị của PC sẽ được tăng lên
đúng độ dài của lệnh đó (32 bit). Sau đó, CPU sẽ lấy lệnh tiếp theo từ bộ nhớ lệnh bằng cách
sử dụng giá trị của PC như địa chỉ của ô nhớ chứa lệnh đó.

MIPS sử dụng kiến trúc RISC (Reduced Instruction Set Computing) với số lượng lệnh rất ít so
với các kiến trúc khác, giúp cho bộ nhớ lệnh được thiết kế đơn giản hơn. Điều này cũng giúp
tăng tốc độ thực thi của CPU. Tuy nhiên, để thực hiện các chức năng phức tạp, như xử lý
chuỗi, số thực, … thì phải sử dụng nhiều lệnh để thực hiện, do đó tốc độ xử lý cũng sẽ giảm
xuống.
4.3.1. Đường dữ liệu
- Tập thanh ghi:
Thanh ghi (Registers): Đây là
nơi lưu trữ các giá trị số học và
logic tạm thời được sử dụng
bởi CPU. Các thanh ghi chính
thường được sử dụng trong
đường dữ liệu bao gồm thanh
ghi tổng (accumulator), thanh
ghi đếm (counter), thanh ghi
chỉ số (index register) và các
thanh ghi trung gian
(intermediate registers).
4.3.1. Đường dữ liệu
- Bộ nhớ dữ liệu:
Bộ nhớ (Memory): Bộ nhớ là
nơi lưu trữ các dữ liệu và
chương trình của máy tính.
Đường dữ liệu sử dụng bộ nhớ
để lấy hoặc lưu trữ các dữ liệu
và chương trình.
4.3.1. Đường dữ liệu
- Khối ALU:

Bộ xử lý chính (ALU): Là
một bộ phận quan trọng của
đường dữ liệu, nó thực hiện
các phép tính số học và
logic, bao gồm cộng, trừ,
nhân, chia, AND, OR, NOT,
XOR, …
4.3.2. Bộ điều khiển

ộ điều khiển (Control Unit):


một thành phần quan trọng
a đường dữ liệu, nó điều
iển các hoạt động của CPU
bộ nhớ theo các lệnh của
ương trình.
4.4 Xây dựng bộ xử lý theo mô hình đơn giản
► Mô hình bộ xử lý đơn giản (mô hình đơn chu kỳ - single-cycle) đặt mục tiêu thiết kế sao
cho tất cả các lệnh đều phải được hoàn thành trong 1 chu kỳ.
► Quá trình thực hiện lệnh phải trải qua 5 giai đoạn cơ bản là:

1. Fetch (Lấy lệnh): Bộ điều khiển lấy lệnh từ bộ nhớ lệnh.

2. Decode (Giải mã): Bộ giải mã giải mã lệnh và tìm ra các toán hạng.

3. Execute (Thực thi): Thực hiện phép tính hoặc thao tác được chỉ định bởi lệnh.

4. Memory Access (Truy cập bộ nhớ): Truy cập bộ nhớ để lưu trữ hoặc lấy dữ liệu.

5. Writeback (Ghi lại): Kết quả được ghi lại vào bộ đệm hoặc bộ nhớ.
1. Giai đoạn lấy(đọc) lệnh
Quá trình Fetch bao gồm các bước sau:

1. Bộ điều khiển sử dụng PC để xác định địa chỉ


lưu trữ của lệnh tiếp theo trong bộ nhớ lệnh.

2. Bộ điều khiển gửi yêu cầu đến bộ nhớ lệnh để


lấy lệnh.

3. Bộ nhớ lệnh đọc lệnh từ địa chỉ được yêu cầu


và trả về cho bộ điều khiển.

4. Bộ điều khiển lưu trữ lệnh vào bộ đệm lệnh và


tăng giá trị của PC để trỏ đến lệnh tiếp theo.

5. Quá trình Fetch kết thúc và các giai đoạn thực


hiện lệnh tiếp theo được bắt đầu.
2. Giai đoạn giải mã lệnh

Quá trình giải mã lệnh bao gồm các bước sau:

1. Lấy lệnh từ bộ đệm lệnh.

2. Xác định loại lệnh và các toán hạng liên quan.

3. Thực hiện các thao tác cần thiết để chuẩn bị các toán hạng cho quá
trình thực thi lệnh.

4. Lưu trữ các giá trị toán hạng vào bộ đệm thanh ghi.
2. Giai đoạn giải mã lệnh
3. Giai đoạn thực thi lệnh
3. Giai đoạn thực thi lệnh

Quá trình thực thi lệnh bao gồm các bước sau:

1. Lấy giá trị toán hạng từ bộ đệm thanh ghi.

2. Thực hiện phép tính cần thiết (phép cộng, trừ, nhân, chia, ...) dựa trên lệnh
và giá trị toán hạng.

3. Lưu trữ kết quả phép tính vào bộ đệm kết quả.

4. Chuyển đến lệnh tiếp theo trong bộ đệm lệnh và bắt đầu giai đoạn Fetch
(Lấy lệnh) cho lệnh đó.
4. Giai đoạn truy xuất bộ nhớ
Quá trình truy cập bộ nhớ bao gồm các bước sau:

1. Lấy địa chỉ bộ nhớ từ bộ đệm thanh ghi.

2. Xác định loại truy cập (đọc hoặc ghi).

3. Thực hiện truy cập bộ nhớ cần thiết.

4. Nếu là truy cập ghi, lưu trữ dữ liệu vào bộ nhớ.

5. Nếu là truy cập đọc, lấy dữ liệu từ bộ nhớ và lưu trữ vào bộ đệm dữ liệu.

6. Chuyển đến lệnh tiếp theo trong bộ đệm lệnh và bắt đầu giai đoạn Fetch (Lấy
lệnh) cho lệnh đó.
4. Giai đoạn truy xuất bộ nhớ
5. Giai đoạn cập nhật kết quả
Quá trình truy cập đọc bao gồm các bước sau:

1 Lấy địa chỉ bộ nhớ từ bộ đệm thanh ghi.

2. Xác định loại truy cập là truy cập đọc.

3. Bộ xử lý gửi yêu cầu đến bộ nhớ để lấy dữ liệu từ vùng bộ nhớ tương ứng với địa chỉ
đã cho.

4. Dữ liệu được trả về từ bộ nhớ.

5. Dữ liệu này được lưu trữ vào bộ đệm dữ liệu của bộ xử lý để sử dụng trong các phép
tính tiếp theo.

6. Chuyển đến lệnh tiếp theo trong bộ đệm lệnh và bắt đầu giai đoạn Fetch (Lấy lệnh) cho
lệnh đó.
5. Giai đoạn cập nhật kết quả
Hoàn chỉnh đường dữ liệu
Ví dụ: về hoạt động của bộ vi xử lý MIPs trong mô hình xử lý đơn chu kỳ

Giả sử chúng ta có lệnh sau đây được lưu trữ trong bộ nhớ lệnh:
add $s0, $s1, $s2

Lệnh này thực hiện phép cộng giữa giá trị của $s1 và $s2 và lưu kết quả vào $s0.

Khi chạy trong mô hình xử lý đơn chu kỳ, bộ vi xử lý MIPS sẽ thực hiện các bước sau:

1. Fetch (Lấy lệnh): Bộ điều khiển lấy lệnh từ bộ nhớ lệnh, đọc lệnh "add $s0, $s1, $s2"
từ địa chỉ đầu tiên trong bộ nhớ lệnh và lưu trữ nó trong bộ đệm lệnh.

2. Decode (Giải mã): Bộ điều khiển giải mã lệnh trong bộ đệm lệnh và lưu trữ các toán
hạng vào bộ đệm thanh ghi. Lệnh "add" sẽ được giải mã và các thanh ghi $s0, $s1 và $s2
sẽ được lưu trữ trong bộ đệm thanh ghi.
3. Execute (Thực thi): Bộ xử lý thực hiện phép cộng giữa giá trị của $s1 và $s2
và lưu kết quả vào $s0 trong bộ đệm kết quả.

4. Memory Access (Truy cập bộ nhớ): Không có hoạt động truy cập bộ nhớ
trong lệnh này, vì vậy bước này được bỏ qua.

5. Write-back (Ghi lại kết quả): Kết quả của phép tính được lưu trữ trong bộ
đệm kết quả sẽ được ghi lại vào bộ đệm thanh ghi để lưu trữ.

Sau khi hoàn thành lệnh này, máy tính đếm chương trình sẽ tăng giá trị của địa
chỉ lệnh hiện tại để đưa ra địa chỉ của lệnh kế tiếp trong bộ nhớ lệnh, và quá
trình này sẽ được lặp lại cho lệnh tiếp theo.
4.5 Xây dựng bộ xử lý theo mô hình xử lý ống
4.5.1 Minh họa mô hình xử lí ống

+ A bắt đầu giặt → B bắt


đầu sấy → C bắt đầu ủi →
D cất
+ Trải qua 4 giai đoạn (giặt,
sấy, ủi, cất) mất 4 giờ/1
người → 16 giờ đồng hồ để
hoàn thành

Mô hình tuần tự
- +

- Sau khi A vừa kết thúc việc


giặt và bắt đầu việc sấy thì
máy giặt đang trống → B có
thể sử dụng máy giặc trong
khi A đang sấy. Mọi thứ cứ
diễn ra thay phiên liên tục
như vậy.
→ Hoàn thành việc giặc ủi
trong 7 giờ thay vì 16 giờ như
quy trình tuần tự

Mô hình xử lý ống
4.5.2 Vấn đề hiệu suất của mô hình đơn giản đơn chu kỳ

𝑻𝒉ờ𝒊 𝒈𝒊𝒂𝒏 𝒈𝒊ữ𝒂 𝒍ệ𝒏𝒉 (Đơ𝒏 𝒄𝒉𝒖 𝒌ỳ)


Độ tăng tốc = Độ tăng tốc của mô hình xử lý ống so với mô hình đơn
𝑻𝒉ờ𝒊 𝒈𝒊𝒂𝒏 𝒈𝒊ữ𝒂 𝟐 𝒍ệ𝒏𝒉 (𝑿ử 𝒍ý ố𝒏𝒈)
chu kỳ là hơn 1.7 lần (2400/1400)
Ví dụ: Giả sử ta có một chương trình đơn giản như sau:
IF: LW $t0, 0($s0)
ADD $s1, $s2, $s3
LW $s0, 0($t0)
Ta sẽ mô tả quá trình thực thi của chương trình này trên mô hình xử lý ống.
Bước 1: Fetch

Lấy lệnh đầu tiên từ địa chỉ bộ nhớ 0x0000 vào bộ nhớ lệnh (IF).
Lấy lệnh thứ hai từ địa chỉ bộ nhớ 0x0004 vào bộ nhớ lệnh (ID).
Lấy lệnh thứ ba từ địa chỉ bộ nhớ 0x0008 vào bộ nhớ lệnh (EX).

Bước 2: Decode

Giải mã lệnh LW trong khối giải mã (ID).


Giải mã lệnh ADD trong khối giải mã (EX).
Giải mã lệnh LW trong khối giải mã (MEM).
Bước 3: Execute

Thực thi lệnh LW (EX).


Thực thi lệnh ADD (MEM).
Thực thi lệnh LW (WB).

Bước 4: Memory Access

Truy cập bộ nhớ để đọc dữ liệu từ địa chỉ được chỉ định bởi lệnh LW (MEM).
Truy cập bộ nhớ để ghi dữ liệu vào địa chỉ được chỉ định bởi lệnh LW (WB).
Bước 5: Write Back

Ghi kết quả của lệnh LW vào thanh ghi t0 (WB).


Quá trình thực thi của chương trình đã hoàn tất. Ta có thể thấy rằng mô hình xử lý ống
cho phép các lệnh được thực thi song song, giúp tăng tốc độ thực thi của chương trình.
4.5.3 Xây dựng đường dữ liệu: TTG : BNDL :
BNL : Tập thanh Bộ nhớ
Khối bộ ghi dữ liệu
- Gồm 3 lệnh: nhớ lệnh

- B1 : Lệnh đọc thứ nhất


được thực thi
- B2: Lệnh đọc thứ 2 được
thực thi trong khi tập
thanh ghi đang thực thi
lệnh đọc thứ 1
- B3 : Tương tự, Lệnh đọc
thứ 3 được thực thi, trong
khi tập thanh ghi đang
thực thi lệnh đọc thứ 2
4.5.4 Xây dựng các tín hiệu điều khiển
1.Giai đoạn đọc lệnh:
Không cần bất kỳ tín hiệu điều khiển nào, lệnh chỉ đang được đọc lên
từ bộ nhớ lệnh.

2. Giai đoạn giải mã lệnh:

Là giai đoạn khối điều khiển căn cứ vào lệnh đọc được từ bộ nhớ lệnh
để sinh ra giá trị các tín hiệu điều khiển tương ứng.
3. Giai đoạn thực thi lệnh:

Có 3 tín hiệu điều khiển (4bit) sẽ được sử dụng trong giai đoạn thực
thi lệnh
- Nguồn ALU
- Đích
- Hành vi ALU
4. Giai đoạn truy xuất bộ nhớ:
Dùng tín hiệu điều khiển rẽ nhánh

5. Giai đoạn cập nhật kết quả:


Sử dụng hai kết quả điều khiển
- Chọn DL ghi
- Ghi thanh ghi
4.5.5 Các rủi ro trong mô hình xử lý ống

Mô hình xử lý ống (pipeline) là một phương pháp tăng tốc độ xử lý của bộ vi xử lý


bằng cách chia các tác vụ xử lý thành các giai đoạn và thực hiện các giai đoạn này
song song trên các bộ xử lý khác nhau. Tuy nhiên, mô hình xử lý ống cũng gặp phải
một số rủi ro như sau:

1. Rủi ro liên quan đến dữ liệu (Data hazards): Điều này xảy ra khi một lệnh phụ
thuộc vào dữ liệu đầu ra của lệnh trước đó. Khi xảy ra rủi ro này, bộ xử lý phải chờ
đến khi lệnh trước đó hoàn thành trước khi thực hiện lệnh tiếp theo. Điều này làm
giảm hiệu quả của mô hình xử lý ống.
4.5.5 Các rủi ro trong mô hình xử lý ống
2. Rủi ro liên quan đến điều kiện (Control hazards): Điều này xảy ra khi việc thực thi
lệnh phụ thuộc vào điều kiện của lệnh trước đó. Khi xảy ra rủi ro này, bộ xử lý phải
chờ đến khi điều kiện được xác định rõ ràng trước khi thực hiện lệnh tiếp theo.

3. Rủi ro liên quan đến các vấn đề xung đột (Structural hazards): Điều này xảy ra khi
hai hoặc nhiều lệnh cố gắng truy cập vào cùng một tài nguyên phần cứng cùng một
lúc. Ví dụ, một lệnh muốn ghi vào bộ nhớ, trong khi lệnh khác đang cố gắng đọc từ
bộ nhớ.

Các rủi ro này có thể được giải quyết bằng cách sử dụng các kỹ thuật như: đổi chỗ
lệnh (reordering), chia nhỏ lệnh (splitting), chèn các lệnh khác giữa các giai đoạn
(interlocking), hoặc sử dụng bộ đệm (buffering) để giải quyết rủi ro liên quan đến dữ
liệu.
4.5.6 Giải quyết rủi ro về dữ liệu
- Rủi ro liên quan đến dữ liệu (Data hazards) là một trong những rủi
ro phổ biến trong mô hình xử lý ống. Nó xảy ra khi một lệnh cần truy
cập đến một thanh ghi mà một lệnh khác đang sử dụng. Điều này
dẫn đến việc phải chờ đợi lệnh đầu tiên thực hiện xong trước khi
thực hiện lệnh tiếp theo, làm giảm hiệu suất của bộ xử lý.

Có 3 phương pháp giải quyết rủi ro về dữ liệu


+ Phương pháp (Scheduling) xắp xếp lại thứ tự các lệnh
+ Phương pháp chựng lại
+ Phương pháp xúc tiến sớm
1. Phương pháp Scheduling là một trong những phương pháp để giải quyết vấn đề này
trong mô hình xử lý ống. Phương pháp này thực hiện bằng cách sắp xếp thứ tự thực hiện
các lệnh sao cho không xảy ra rủi ro liên quan đến dữ liệu.

Có hai phương pháp Scheduling phổ biến để giải quyết vấn đề Data hazards:
a. Forwarding (còn gọi là Data forwarding hoặc bypassing): Phương pháp này cho phép
truyền trực tiếp kết quả của một lệnh đến lệnh tiếp theo mà cần sử dụng nó mà không cần
lưu trữ vào bộ nhớ trung gian. Điều này giúp giảm thời gian chờ đợi và tăng hiệu suất của
bộ xử lý.

b. Stalling (còn gọi là bubble): Phương pháp này dùng để tạo ra một chu kỳ trống
(bubble) giữa hai lệnh cần truy cập vào cùng một thanh ghi để đảm bảo rằng kết quả của
lệnh trước đã được lưu trữ đầy đủ trước khi lệnh tiếp theo được thực hiện.

Tuy nhiên, việc sử dụng phương pháp Scheduling cũng có một số hạn chế. Việc sắp xếp
lại thứ tự thực hiện các lệnh có thể làm cho chương trình không hoạt động đúng như ý
muốn. Ngoài ra, việc tạo ra chu kỳ trống cũng làm giảm hiệu suất của bộ xử lý.
2. Phương pháp chựng lại

Rủi ro liên quan đến điều kiện (Control hazards) là một trong những rủi ro phổ biến trong mô
hình xử lý ống. Nó xảy ra khi bộ vi xử lý không thể đoán trước được lệnh nhảy sẽ nhảy tới
đâu, dẫn đến việc thực hiện lệnh tiếp theo không đúng, gây ra lỗi trong kết quả tính toán.

Để giải quyết rủi ro liên quan đến điều kiện, một trong những phương pháp phổ biến là thực
hiện thêm lệnh nhảy trễ (delayed branch). Ý tưởng của phương pháp này là thêm một lệnh
nhảy (branch) vào ngay sau lệnh nhảy (branch) gốc, tuy nhiên lệnh nhảy này không được
thực hiện ngay mà phải trì hoãn một chu kỳ xử lý.
Khi thực hiện lệnh nhảy gốc, bộ vi xử lý sẽ lưu trữ địa chỉ của lệnh nhảy
trễ vào bộ đệm địa chỉ, sau đó thực hiện lệnh tiếp theo. Trong một chu kỳ
xử lý tiếp theo, lệnh nhảy trễ sẽ được thực hiện, đến địa chỉ mới mà nó
nhảy tới, thực hiện lệnh ở địa chỉ mới này.

Với phương pháp thực hiện thêm lệnh nhảy trễ, bộ vi xử lý sẽ đảm bảo
thực hiện lệnh tiếp theo của lệnh nhảy gốc là lệnh nhảy trễ, đảm bảo
không xảy ra rủi ro liên quan đến điều kiện. Tuy nhiên, phương pháp này
sẽ tăng thời gian xử lý và tốn tài nguyên bộ nhớ hơn do cần phải lưu trữ
thêm lệnh nhảy trễ.
3. Phương pháp xúc tiến sớm
Phương pháp xúc tiến sớm (Early forwarding) là một kỹ thuật giải
quyết rủi ro liên quan đến dữ liệu (data hazards) trong mô hình xử lý
ống. Kỹ thuật này cho phép bộ xử lý truyền dữ liệu từ lệnh trước đến
lệnh sau một cách nhanh chóng, thay vì phải chờ đợi đến khi dữ liệu
được lưu vào bộ nhớ.

Cụ thể, phương pháp này thực hiện truyền dữ liệu từ lệnh A đến lệnh
C thông qua lệnh B, nơi lệnh A là lệnh trước đó và lệnh C là lệnh sau
đó. Điều này được thực hiện bằng cách sử dụng bộ đệm trung gian
(buffer) để lưu trữ dữ liệu trung gian, nơi dữ liệu từ lệnh A được lưu
trữ cho đến khi lệnh B hoàn thành việc tính toán và đưa ra kết quả, và
Sub $s2, $s1, $s3

And $s7, $s2, $s5

Or $s8, $s6, $s2

Add $s0, $s2, $s2

Sw $15, 100($2)
- Cũng giống như phương pháp
chựng lại, phương pháp xúc tiến
sớm cần phải có những khối phần
cứng giúp nhận diện các rủi ro về
dữ liệu.
- Khác với phương pháp chựng lại,
phương pháp xúc tiến sớm không
làm giảm hiệu suất ống lệnh vì các
lệnh được thực thi liên tục mà
không cần phải trì hoãn như trong
phương pháp chựng lại.
4.5.7:Hiện thực phương pháp xúc tiến sớm giải quyết rủi ro về
dữ liệu:

:
1.rủi ro về dữ liệu
HIỆN thực thi
THỰC
PHƯƠNG
PHÁP
XÚC TIẾN
SỚM 2.rủi ro về dữ liệu truy
xuất bộ nhớ
4.5.7 phương pháp xúc tiến sớm giải quyết rủi ro về dữ liệu:

- Phương pháp xúc tiến sớm (Early forwarding) là một phương


pháp giải quyết rủi ro liên quan đến dữ liệu trong mô hình xử
lý ống. Phương pháp này giúp tránh tình trạng đợi lệnh hoặc
phải thực hiện thêm các lệnh phụ để giải quyết rủi ro.

- Phương pháp xúc tiến sớm sử dụng kết quả của các phép tính
trước đó để cung cấp trực tiếp cho lệnh hiện tại. Nói cách khác, khi
một lệnh tính toán giá trị, nó sẽ cập nhật giá trị đó trực tiếp vào bộ
đệm thanh ghi mà không chờ đợi bộ đệm kết quả được cập nhật.
Lệnh tiếp theo có thể sử dụng giá trị mới nhất trong bộ đệm thanh
ghi này.
4.5.7 phương pháp xúc tiến sớm giải quyết rủi ro về dữ liệu:
Nếu không sử dụng phương pháp xúc tiến sớm, lệnh thứ 2 phải
chờ đợi kết quả từ lệnh thứ 1 và lệnh thứ 3 phải chờ đợi kết quả
từ lệnh thứ 1 hoặc lệnh thứ 2. Như vậy, mỗi lệnh phải đợi ít nhất
Ví dụ, giả sử có một đoạn một chu kỳ đồng hồ trước khi có thể thực hiện được. Tuy nhiên,
chương trình như sau: nếu sử dụng phương pháp xúc tiến sớm, giá trị của lệnh add sẽ
được lưu trữ trực tiếp vào bộ đệm thanh ghi $t0. Vì vậy, lệnh thứ
add $t0, $s1, $s2 2 và lệnh thứ 3 có thể truy cập trực tiếp vào giá trị này mà không
add $t1, $t0, $s3 phải chờ đợi. Như vậy, thời gian thực hiện chương trình sẽ nhanh
sub $t2, $t0, $s4 hơn.

Tuy nhiên, phương pháp xúc tiến sớm cũng có một số hạn chế.
Nó chỉ hoạt động trong trường hợp khi lệnh tính toán giá trị đầu
ra được sử dụng ngay lập tức bởi lệnh tiếp theo.
Nếu giá trị được tính toán trong lệnh này không được sử dụng
ngay lập tức, phương pháp này sẽ không hoạt động.
4.5.8 Xây dựng khối xúc tiến sớm giải quyết rủi ro về dữ liệu:
Khối điều khiển “xúc tiến sớm” (early forwarding) là một khối điều khiển trong
mô hình xử lý ống, được sử dụng để giải quyết các rủi ro liên quan đến dữ liệu.
Khối điều khiển này sẽ kiểm tra các lệnh đang ở các giai đoạn trước đó trong
pipeline để xác định xem liệu có thể xúc tiến giá trị từ bộ đệm thanh ghi nguồn
tới bộ đệm thanh ghi đích của lệnh đang ở giai đoạn thực hiện hay không.

Ví dụ, nếu lệnh đang ở giai đoạn thực hiện yêu cầu một giá trị từ bộ đệm thanh
ghi, khối điều khiển “xúc tiến sớm” sẽ kiểm tra xem giá trị đó có thể được xúc
tiến từ giai đoạn giải mã hoặc tính toán không. Nếu có, giá trị sẽ được xúc tiến
sớm vào bộ đệm thanh ghi đích của lệnh thực hiện. Điều này giúp tránh được
rủi ro liên quan đến dữ liệu và giảm thiểu thời gian chờ đợi trong pipeline.
4.5.8 Xây dựng khối xúc tiến sớm giải quyết rủi ro về dữ liệu:
ví dụ về khối điều khiển “xúc tiến sớm” trong mô hình xử lý ống:

Lệnh: ADD $t0, $s0, $s1

Giai đoạn Fetch: Lấy lệnh ADD từ bộ nhớ lệnh.


Giai đoạn Decode: Giải mã lệnh ADD và lưu trữ giá trị của $s0 và $s1 vào bộ đệm thanh ghi.
Giai đoạn Execute: Cộng giữa giá trị của $s0 và $s1 và lưu kết quả vào bộ đệm kết quả.
Giai đoạn Memory: Không có hoạt động.
Giai đoạn Write back: Lưu trữ kết quả của phép cộng vào bộ đệm thanh ghi $t0.
Lệnh: ADD $t1, $t0, $s2

Giai đoạn Fetch: Lấy lệnh ADD từ bộ nhớ lệnh.


Giai đoạn Decode: Giải mã lệnh ADD và kiểm tra xem giá trị của $t0 có thể được xúc tiến sớm
từ giai đoạn thực hiện của lệnh trước không. Nếu có, giá trị của $t0 sẽ được xúc tiến sớm vào
bộ đệm thanh ghi đích của lệnh ADD này. Lưu trữ giá trị của $s2 vào bộ
4.5.9: Giải quyết rủi ro về điều khiển:
A: Phương pháp tiên đoán:

Có 2 phương pháp tiên


đoán:

phương pháp tiên đoán tĩnh

phương pháp tiên đoán


động
4.5.9: Giải quyết rủi ro về điều khiển:
A: Phương pháp tiên đoán tĩnh
Phương pháp tiên đoán tĩnh (static branch prediction) là một phương pháp giải
quyết rủi ro về điều khiển trong mô hình xử lý ống. Thay vì đợi đến khi lệnh
nhảy được thực thi để xác định lệnh tiếp theo, phương pháp này sử dụng các
quy tắc để dự đoán lệnh tiếp theo sẽ là gì khi gặp lệnh nhảy.

Có hai loại phương pháp tiên đoán tĩnh chính là:

Phương pháp tiên đoán dựa trên quy tắc (rule-based prediction): Phương pháp
này dựa trên việc xây dựng các quy tắc để đưa ra dự đoán. Ví dụ, nếu lệnh
nhảy là lệnh rẽ nhánh (branch) và điều kiện là so sánh hai số, nếu số thứ nhất
lớn hơn số thứ hai thì lệnh tiếp theo sẽ là lệnh ở địa chỉ nằm sau lệnh nhảy,
ngược lại thì lệnh tiếp theo sẽ là lệnh ở địa chỉ sau lệnh nhảy + 4.
4.5.9: Giải quyết rủi ro về điều khiển:
A:Phương pháp tiên đoán tĩnh:
Phương pháp tiên đoán dựa trên lịch sử (history-based prediction):
Phương pháp này dựa trên lịch sử của các lệnh nhảy để đưa ra dự
đoán. Cụ thể, mỗi lần thực thi một lệnh nhảy, hệ thống sẽ lưu lại thông
tin về lệnh nhảy đó (ví dụ: địa chỉ, kết quả dự đoán). Khi gặp lại lệnh
nhảy đó trong tương lai, hệ thống sẽ dựa trên thông tin đã lưu để đưa
ra dự đoán.

Tuy nhiên, phương pháp tiên đoán tĩnh cũng có nhược điểm là không
thể đưa ra dự đoán chính xác 100% và có thể dẫn đến sai sót. Vì vậy,
cần phải kết hợp với các phương pháp khác như tiên đoán động
(dynamic branch prediction) để tối ưu hoá hiệu suất của mô hình xử lý
ống.
4.5.9: Giải quyết rủi ro về điều khiển:
B: Phương pháp tiên đoán động:

Phương pháp tiên đoán động (dynamic branch prediction) là một phương
pháp giải quyết rủi ro về điều khiển bằng cách dự đoán xem nhánh (branch)
sẽ đi tới đâu. Để làm được điều này, mô hình xử lý ống sẽ sử dụng một bộ
dự đoán nhánh (branch predictor) để đưa ra dự đoán về điểm nhảy của
nhánh, và tiên đoán này sẽ được sử dụng để đưa ra quyết định về việc tải
lệnh từ bộ nhớ và thực hiện lệnh tiếp theo.
Có hai loại phương pháp tiên đoán động:

Động lực học (dynamic): Các phương pháp này dựa trên lịch sử các nhánh đã
được thực thi để đưa ra quyết định dựa trên mẫu hoặc trạng thái trước đó của các
nhánh. Một ví dụ của phương pháp này là bộ dự đoán nhánh hai bít (2-bit branch
predictor).

Thông minh (smart): Các phương pháp này sử dụng các thuật toán thông minh để
dự đoán điểm nhảy của các nhánh. Một ví dụ của phương pháp này là bộ dự đoán
nhánh hướng tới mục tiêu (target-directed branch predictor).

Tuy nhiên, phương pháp tiên đoán động cũng có thể gây ra những sai lầm dự
đoán và dẫn đến thời gian chậm hơn khi phải hủy bỏ các lệnh đã thực hiện trước
đó. Do đó, cần cân nhắc cẩn thận khi áp dụng phương pháp này và đảm bảo tính
chính xác của bộ dự đoán nhánh để tối ưu hiệu suất của mô hình xử lý ống.
4.5.9: giải quyết rủi ro về điều khiển:
B: Làm giảm ảnh hưởng của rủi ro về điều khiển:
Để làm giảm ảnh hưởng của rủi ro về điều khiển trong mô hình xử lý ống, có thể áp dụng các kỹ thuật sau:

Tiên đoán tĩnh (Static prediction): Dựa trên thông tin cố định về lệnh nhảy để đưa ra quyết định tiên đoán.
Phương pháp này đơn giản, nhưng không hiệu quả cho các chương trình có cấu trúc rẽ nhánh phức tạp.

Tiên đoán động (Dynamic prediction): Dựa trên lịch sử thực thi của chương trình để đưa ra quyết định tiên
đoán. Có hai loại tiên đoán động là tiên đoán động không điều kiện (unconditional dynamic prediction) và tiên
đoán động có điều kiện (conditional dynamic prediction).

Tiên đoán động không điều kiện (Unconditional dynamic prediction): Dựa trên lịch sử thực thi của chương
trình để đưa ra quyết định tiên đoán. Khi một lệnh nhảy được gặp, trình điều khiển sẽ tiên đoán rằng nhảy đến
địa chỉ mới và tiếp tục thực hiện các lệnh tiếp theo. Nếu tiên đoán sai, trình điều khiển sẽ quay trở lại lệnh
nhảy và thực thi lại từ đó.

Tiên đoán động có điều kiện (Conditional dynamic prediction): Dựa trên lịch sử thực thi của chương trình và
thông tin về điều kiện của lệnh nhảy để đưa ra quyết định tiên đoán. Phương pháp này cho phép trình điều
khiển xác định xem lệnh nhảy có được thực hiện hay không trước khi nó được thực hiện thực sự.

You might also like