CPU được viết tắt từ Central Processing Unit – Bộ xử lí trung tâm hay còn gọi là bộ vi xử lí .
Nhiệm vụ CPU là xử lí số liệu , cách xử lí số liệu như thế nào phụ thuộc vào chương trình điều khiển .
Khi bạn bấm vào Icon để thực hiện chương trình thì quá trình làm việc như sau :
1. Chương trình đã được lưu trữ trên ổ cứng sẽ được truyền vào bộ nhớ của máy tính ( RAM ) . Chương trình là một loạt những lệnh cho CPU .
2. CPU dùng mạch điện tử để điều khiển bộ nhớ tải số liệu chương trình từ RAM .
3. Bây giờ số liệu đã bên trong CPU và được xử lí .
4. Những gì xảy ra tiếp theo tuỳ thuộc vào chương trình . CPU có thể tiếp tục tải số liệu để thực hiện chương trình hoặc làm một việc gì đó để xử lí số liệu , ví dụ như hiển thị một cái gì đó lên màn hình …
Ngày trước CPU điều khiển truyền số liệu giữa ổ cứng và RAM khi đó tốc độ truy cập số liệu ổ cứng chậm hơn rất nhiều tốc độ truy cập RAM vì vậy làm cho cả hệ thống sẽ chậm xuống , do đó CPU làm việc rất vất vả cho tới khi số liệu được truyền xong từ ổ cứng vào bộ nhớ RAM . Phương pháp này gọi là PIO (Processor I/O hoặc Programmed I/O).
Ngày nay việc truyền số liệu giữa ổ cứng và RAM không sử dụng CPU nữa như vậy làm cho hệ thống chạy nhanh hơn phương thức truyền số liệu này gọi là DMA (Direct Memory Access) .
Trong thiết kế Mainboard của máy tính IC gọi là Nortbridge Chipset được thiết kế cho chuyển số liệu trực tiếp giữa ổ cứng và CPU.
Trong bộ vi xử lí của hãng AMD , mainboard sử dụng socket 754, 939 và 940 (Athlon 64, Athlon 64 X2, Athlon 64 FX, Opteron và một vài dòng Sempron ) , ngay bên trong CPU có gắn liền với bộ điều khiển bộ nhớ không cần NorthBridge Chipset vì vậy mà CPU truy cập vào bộ nhớ nhanh hơn.
Khi nói đến CPU phải nói đến khái niệm Clock .
Trong các linh kiện số hầu hết đều có tín hiệu đưa vào IC gọi là Clock – xung đồng hồ – nhằm mục đích để đồng bộ tín hiệu .
Clock được dùng để đồng bộ tín hiệu có thể là tín hiệu ra , có thể tín hiệu vào , những tín hiệu này để bắt đầu thực hiện một công việc nào đó trong linh kiện số .
Tín hiệu Clock là những xung vuông lên xuống như sau :
Bắt đầu mỗi chu kỳ xung được đánh dấu bằng mũi tên lên . Tín hiệu Clock được goi là Hertz (Hz) , và được tính số xung nhịp trong một giây .
Clock 100MHz có nghĩa là 100 triệu xung nhịp ( clock ) trong một giây . Trong máy tính tất cả công việc được đánh giá theo chu kỳ lệnh của xung đồng hồ ( clock ) .
Ví dụ người ta nói bộ nhớ RAM dùng 5 latency có nghĩa là thời gian trễ 5 chu kì đồng hồ sẽ có tín hiệu sẵn sàng để đọc /viết số liệu trong RAM .
Trong CPU quy định trong thời gian nhất định bao nhiêu chu kì lệnh ( bao nhiêu xung nhịp clock ) sẽ thực hiện một phép tính nào đó .
Ví dụ phép tính
MOV DX, AX – chuyển nội dung trong thanh ghi AX sang thanh ghi DX
Sử dụng cần một chu kì đồng hồ
Như vậy nếu cùng dòng sản phẩm CPU nào có tốc độ xung nhịp càng cao thì tốc độ xử lí phép tính càng cao .
Nếu như cùng một loại CPU ví dụ cùng Intel CPU 486DX66 và CPU 486DX33 thì rõ ràng rằng tốc độ xử lí phép tính của 486DX66 nhanh hơn 486DX33 .
Nhưng với những loại CPU khác nhau của hãng khác nhau như Intel hoặc AMD thì nói tốc độ xung nhịp cao thì chưa chắc tốc độ xứ lí phép tính đã nhanh .
Ví dụ để thực hiện lệnh A hãng CPU X cần 9 clock
để thực hiện lệnh A hãng CPU Y cần 5 clock
như vậy nếu CPU X có Clock – ví dụ 10Mhz – cao hơn CPU Y có clock – ví dụ 5Mhz nhưng chưa chắc tốc độ xử lí phép tính của CPU X cao hơn tốc độ xử lí phép CPU Y
Vì vậy tốc độ xử lí CPU còn phụ thuộc nhiều thành phần trong đó như Cache , phép tính phức hợp ….
Đồng hồ ngoài – External Clock ( EC )
Bạn có thể xem thêm khái niệm FSB
Ngày nay việc sản xuât CPU còn có một khái niệm mới nhân tần ( nhân đồng hồ ) , khái niệm này bắt đầu từ dòng sản phẩm 486DX2 .
Ví dụ 486DX266 thì tốc độ đồng hồ bên trong CPU là 66MHz , nhưng tốc độ đồng hồ đưa vào chân Clock của CPU chỉ là 33MHz , vào bên trong CPU được nhân lên 2 thành 66 MHz .
Tất cả các CPU bây giờ thì EC cũng được dùng làm xung nhịp để chuyển số liệu tới và từ số liệu trong RAM … và EC này thấp hơn so với xung đồng hồ bên trong CPU , lấy ví dụ theo hình dưới đây
CPU ở đây có tốc độ 3,4GHz là xung nhịp bên trong CPU là 3,4GHz , tốc độ này được nhân lên 17 từ tốc độ bên ngoài là 200Mhz .
200MHz cũng chính là tốc độ chuyền số liệu từ CPU với RAM
Sự chênh lệch quá lớn giữa tốc độ bên trong CPU và tốc độ bên ngoài CPU sẽ làm cho giá thành sản xuât Mainboard giảm xuống , thuận tiện cho quá trình truyền dẫn tín hiệu , giảm tối đa nhiễu có thể mà vẫn tăng được tốc độ xử lí bên trong CPU.
Bên cạnh đó với tốc độ Clock bên ngoài cũng phù hợp với các linh kiện khác đi kèm theo .
Để giảm thiểu tối đa tác động của EC lên các thành phần khác người ta tăng dung lượng của bộ nhớ Cache nằm bên trong CPU .
Một cách khác để tăng tốc độ truyền số liệu khi EC thấp bằng cách truyền số liệu nhiều hơn tròn một chu kì đồng hồ . Cách thức này đều được Intel và AMD áp dụng khi Intel truyền 4 số liệu một lúc trong một chu kì lệnh và AMD truyền 2 số liệu trong một chu kì lệnh .
Kỹ thuật truyền 2 số liệu trong một chu kì lệnh gọi là DDR – Dual Data Rate
Kỹ thuật truyền 4 số liệu trong một chu kì lệnh gọi là QDR – Quad Data Rate
Sơ đồ khối của CPU
Trong hình dưới đây chúng ta có thể xem sơ đồ khối của CPU . Có nhiều sự khác nhau giữa cấu trúc của Intel và AMD . Ở đây chúng ta chỉ bàn đến phần chung , phần cơ bản nhất trong đó .
Trong hình có phần đường kẻ là thân của CPU , bộ nhớ RAM nằm ở bên ngoài CPU .
Đường dữ liệu giữa bộ nhớ hệ thống RAM và CPU thông thường có độ rộng 64-bit ( hoặc 128-bit khi sử dụng cấu hình Dual Channel ) chạy với tốc độ xung nhịp của bộ nhớ hoặc FSB .
Số của bit được dùng và xung nhịp đồng hồ được gọi là tốc độ truyền dữ liệu , đơn vị đo là MB/s .
Tốc độ truyền được tính = Số của bits x Xung nhịp đồng hồ /8 .
Nếu hệ thống sử dụng DDR400 dùng Single Channel ( 64bits ) thì tốc độ truyền sẽ là 3200MB/s , nếu sử dụng cấu hình Dual Channel ( 128bits ) thì tốc độ truyền là 64000MB/s .
Tất cả mạch nằm bên trong đường kẻ chạy với tốc độ xung nhịp bên trong CPU . Phụ thuộc vào một vài kiểu CPU sẽ có một vài phần có thể chạy với tốc độ xung nhịp cao hơn . Cũng như vậy , đường dữ liệu giữa các thành phần bên trong CPU có thể rộng hơn , có nghĩa là truyền nhiều hơn 64 bits hoặc 128 bits trong một chu kì đồng hồ . Ví dụ : đường truyền dữ liệu giữa bộ nhớ Cache L2 và Cache lệnh L1 thông thường có độ rộng là 256 bits . Với số bits cao hơn trong một chu kì đồng hồ thì hiển nhiên tốc độ truyền dữ liệu cũng sẽ cao hơn .
Trong hình trên mũi tên đỏ là đường truyền dữ liệu giữa bộ nhớ hệ thống RAM với bộ nhớ Cache L2 và mũi tên xanh là giữa những khối khác bên trong có tốc độ xung nhịp và độ rộng của đường truyền dữ liệu khác khau .
Bộ nhớ Cache
Bộ nhớ Cache là một loại bộ nhớ có có hiệu suất cao hơn , nó cũng được gọi là bộ nhớ tĩnh .
Loại bộ nhớ được sử dụng chính trên Mainboard được gọi là bộ nhớ động .
Bộ nhớ tĩnh có mức tiêu thụ điện năng , giá thành , kích thước vật lí cao hơn bộ nhớ động , nó có thể làm việc cùng với xung nhịp đồng hồ như là CPU , trong khi đó bộ nhớ động không có khả năng như vậy .
Đi ra bên ngoài để lấy số liệu ở bộ nhớ có xung nhịp đồng hồ thấp hơn cho CPU kỹ thuật sử dụng bộ nhớ Cache đảm nhiệm . Khi CPU tải dữ liệu ở một vị trí bộ nhớ xác định trước , mạch điện sẽ gọi phần điều khiển bộ nhớ Cache tải vào bộ nhớ Cache tất cả khối dữ liệu bên dưới vị trí hiện hành mà CPU đã tải . Thông thường chương trình theo một khối dữ liệu liên tục ở những vị trí bộ nhớ tiếp theo mà CPU sẽ yêu cầu sẽ có thể ngay ngay lập bên dưới vị trí bộ nhớ đã được tải . Khi đó phần điều khiển bộ nhớ Cache đã sẵn sàng tải nhiều dữ liệu bên dưới vị trí đầu tiên mà CPU đã đọc nó , số liệu kế tiếp sẽ được ở bên trong bộ nhớ Cache do đó mà CPU không cần ra bên ngoài để lấy dữ liệu , nó đã được tải sẵn bên trong bộ nhớ Cache gắn liền bên trong CPU , chúng truy cập với tốc độ xung nhịp bên trong CPU .
Phần điều khiển Cache thường quan sát vị trí bộ nhớ đã được tải và dữ liệu đang được tải từ một vài vị trí bộ nhớ sau khi vị trí bộ nhớ đó vừa được đọc .
Ví dụ : nếu CPU đã tải và lưu trữ dữ liệu ở địa chỉ 1000 , phần điều khiển Cache sẽ tải dữ liệu từ địa chỉ “n” đằng sau địa chỉ 1000. Số “n” này được gọi là trang (Page) , nếu quá trình xử lí làm việc với Page là 4KB ( thông thường là như vậy) nó sẽ tải dữ liệu từ địa chỉ 4096 bên dưới vị trí bộ nhớ đã tải ( trong ví dụ là 1000 ) .
Hình dưới đây mô tả ví dụ này
Bộ nhớ Cache càng lớn thì cơ hội dữ liệu được yêu cầu do CPU được sẵn sàng ngày càng lớn , do đó CPU sẽ truy cập trực tiếp vào RAM càng ít , như thế sẽ làm tăng hiệu suất của hệ thống .
Chúng ta gọi là “hit” khi CPU tải những dữ liệu được yêu cầu từ bộ nhớ Cache , và chúng ta gọi là “miss” nếu dữ liệu mà CPU yêu cầu không có trong bộ nhớ Cache và lúc này CPU cần phải truy cập vào bộ nhớ của hệ thống RAM .
L1 và L2 có nghĩa là “mức 1” – Level 1 , “mức 2” – Level 2 tương ứng và ám chỉ tới khoảng cách của chúng tới nhân CPU ( phần thực hiện công việc ) .
Một điều chúng ta cần chú ý là tại sao lại tách ra ba bộ nhớ Cache : Cache dữ liệu L1 , Cache chỉ dẫn L1 và Cache L2 .
Như hình trên cùng chúng ta sẽ thấy rằng Cache chỉ dẫn L1 làm việc như là “Cache đầu vào” , trong khi Cache dữ liệu L1 làm việc như ” Cache đầu ra ” . Cache chỉ dẫn L1 – thông thường nhỏ hơn Cache L2 – là hiệu quả một cách chi tiết khi chương trình bắt đầu để lặp lại một phần nhỏ , bởi vì yêu cầu chỉ dẫn sẽ kèm theo tới phần tìm về ( Fetch Unit ) .
Trong một vài nhà sản xuất hai phần Cache L1 được tách ra ( Cache chỉ dẫn là “I” – instruction và Cache dữ liệu ” D” – data ) , một vài nhà sản xuất lại gộp lại thành như là 128KB separated có nghĩa là 64KB Cache chỉ dẫn và 64 KB Cache dữ liệu .
Trong CPU Pentium 4 ( và Celeron sử dụng socket 478 và 775 ) không có Cache chỉ dẫn L1 , thay vào đó chúng có Cache có tên là Trace Execution – dấu vết thực hiện chúng lưu trữ vị trí giữ phần Decode và phần thực hiện (Execution Unit) . Do đó Cache chỉ dẫn L1 là như thế nhưng có tên khác và vị trí khác .
Chúng ta đề cập vấn đề này bởi vì có nhiều người hiểu rằng bộ vi xử lí Pentium 4 không có Cache chỉ dẫn L1 . Do đó khi so sánh Pentium 4 với CPU khác người ta nghĩ rằng Cache L1 nhỏ hơn , nhưng hiển nhiên Cache Trace Execution của Pentium 4 và Celeron lại là 150KB sẽ phải được tính đến .
Quá trình phân nhánh
Như đã đề cập phần trước , một vấn đề chính của CPU là có quá nhiều Cache “miss” , bởi vì Fetch Unit phải truy cập trực tiếp tới bộ nhớ hệ thống RAM chậm , như vậy sẽ làm hệ thống chậm đi .
Thông thường sử dụng bộ nhớ Cache để tránh vấn đề trên , nhưng có một tình huống hay xảy ra ở đó phần điều khiển Cache sẽ bị “miss” : bị phân nhánh . Nếu trong khoảng giữa của chương trình có lệnh gọi là JMP ( lệnh Jump hoặc Go to ) gửi chương trình tới một vị trí hoàn toàn khác . trong tình huống này không thể tải ở trong bộ nhớ Cache L2 , nó làm cho Fetch Unit phải truy cập trực tiếp vào bộ nhớ hệ thống RAM . Trong lệnh để giải quyết tình huống này , phần điều khiển Cache của CPU phân tích khối bộ nhớ mà nó tải về để tìm xem lệnh JMP nằm ở đâu và nó sẽ tải khối bộ nhớ đó vào trong Cache L2 trước khi CPU yêu cầu lệnh những JMP .này .
Hình dưới đây mô tả tình huống rẽ nhánh không điều kiện
Đây là vấn đề dễ giải quyết , còn một vấn đề là kh ichương trình rẽ nhánh có điều kiện , có nghĩa là chương trình sẽ chạy tuỳ thuộc vào điều kiện có hay không biết trước . Lấy ví dụ : nếu a=b chạy tới địa chỉ 2 .
Chúng ta sẽ xem hình dưới đây:
Trong tình huống trên dễ xảy ra tình trạng Cache “miss” bởi vì giá trị a , b chưa biết trước mà phần điều khiển Cache chỉ tìm được lệnh JMP .
Giải pháp như sau : phần điều khiển Cache sẽ tải cả hai điều kiện vào trong bộ nhớ Cache . Sau cùng khi CPU xử lí lệnh rẽ nhánh nó sẽ đơn giản huỷ bỏ một điều kiện không được chọn tới . Đó là tốt nhất để tải bộ nhớ Cache còn hơn là truy cập trực tiếp dữ liệu bên trong bộ nhớ hệ thống RAM .
Quá trình xử lí các lệnh
Fetch Unit sẽ tải những lệnh từ bộ nhớ . Đầu tiên nó sẽ tìm những lệnh mà CPU yêu cầu bên trong Cache chỉ dẫn ( lệnh ) L1 , nếu không có nó sẽ tới bộ nhớ Cache L2 . Nếu lệnh cũng không có nó sẽ tải trực tiếp từ bộ nhớ của hệ thống RAM .
Khi chúng ta bất máy tính tất cả bộ nhớ Cache hoàn toàn rỗng , khi hệ thống bắt đầu tải chương trình hệ thống , CPU sẽ bắt đầu xử lí những lệnh đầu tiên được tải từ ổ cứng và phần điều khiển cache bắt đầu tải vào bộ nhớ Cache , và quá trình làm việc bắt đầu .
Sau khi Fetch Unit lấy những lệnh được CPU yêu cầu để xử lí , nó sẽ gửi chúng tới Decode Unit ( phần giải mã ) .
Decode Unit sẽ tính ra những lệnh thông thường để làm . Nó làm bằng một chương trình trong bộ nhớ ROM tồn tại bên trong CPU gọi là Microcode . Mỗi một lệnh để cho CPU hiểu được đặt trong microcode . Microcode sẽ “dạy” cho CPU phải làm những gì . Nó như là hướng dẫn từng bước một cho mọi lệnh . Nếu lệnh được tải , ví dụ , a+b , microcode sẽ nói cho Decode Unit rằng nó cần hai tham số a và b . Decode Unit sẽ yêu cầu Fetch Unit lấy dữ liệu ở trong hai ô nhớ mà giá trị bên trong là a và b . Sau đó Decode Unit sẽ “dịch” lệnh này và lấy tất cả dữ liệu yêu cầu để thực hiện lệnh . Nó sẽ lấy dữ liệu một cách từng bước một để tới phần thực hiện lệnh ( Execute Unit ) và cho biết lệnh đó thực hiện như thế nào .
Execute Unit cuối cùng sẽ thực hiện lệnh đó . Trong nhiều kiểu CPU chúng ta sẽ thấy có một vài Execute Unit làm việc song song với nhau . Điều này sẽ làm tăng hiệu suất của quá trình xử lí lệnh . Ví dụ : một CPU có sáu Excute Unit có thể thực hiện sáu lệnh song song với nhau , do đó về mặt lí thuyết nó có thể đạt được như là sáu bộ vi xử lí bên trong một Execute Unit . Cấu trúc như vậy gọi là cấu trúc Superscalar .
Thông thường CPU không có vài Execute Unit riêng biệt , chúng có Execute Unit chuyên để thực hiện một loại lệnh nào đó . Ví dụ là FPU , Float Point Unit, được sử dụng để thực hiện những phép toán phức tạp .
Bình thường giữa Decode Unit và Execute Unit có một phần gọi là Dispatch ( hoặc Schedule Unit ) để gửi lệnh tới đúng Execute Unit mà nó cần , có nghĩa là nếu lệnh là phép toán nó sẽ được gửi tới FPU nếu không phải nó sẽ gửi tới Execute Unit chung . Những Execute Unit chung đó gọi là ALU, Arithmetic and Logic Unit .
Cuối cùng khi quá trình xử lí kết thúc , kếy quả được gửi tới Cache dữ liệu L1 . Kết quả này có thể dược gửi quay trở lại bộ nhớ hệ thống RAM hoặc gửi tới một chỗ khác , ví dụ như card màn hình . Nhưng điều này sẽ phụ thuộc vào lệnh tiếp theo mà trong quá trình xử lí tiếp diễn ( lệnh tiếp theo có thể là ” in kết quả ra màn hình “).
Một đặc điểm cần quan tâm khác mà tất cả bộ vi xử lí có một thời gian dài gọi là “pipeline” , khả năng có vài lệnh khác nhau ở những tầng ( stage ) khác nhau của CPU trong cùng một thời gian .
Sau khi Fetch Unit gửi lệnh tới Decode Unit , nó sẽ tạm nghỉ không làm gì có phải không ? Do đó nó sẽ phải làm gì để thay thế thời gian không làm gì , có yêu cầu Fetch Unit lấy lệnh tiếp theo không ? . Khi lệnh đầu tiên tới Execute Unit , Fetch Unit có thể gửi lệnh tiếp theo tới Decode Unit và tiếp tục lấy tiếp lệnh thứ ba , cứ như thế .
Trong kiểu CPU có 11 stage ( stage là tên khác của mỗi thành phần – unit – bên trong CPU ) , có sẽ có thể có 11 lệnh bên trong liên tục trong cùng một lúc . Trên thực tế tất cả kiểu CPU đều có cấu trúc Superscalar , có nhiều lệnh thực hiện liên tục bên trong CPU .
Như trên đã nói CPU có Pipeline 11-stage , thì một lệnh để thực hiện đầy đủ sẽ phải qua 11 phần ( unit) . Số tầng càng cao thì thời gian trễ để thực hiện một lệnh đầy đủ càng lớn .
Có một vài mẹo nhỏ được sử dụng trong một vài kiểu CPU để tăng hiệu suất . Chúng ta sẽ giải thích hai trong số chúng đó là Out-Of-Order execution (OOO) và thực hiện suy đoán Speculative Execution.
Out-Of-Order Execution ( OOO)
Chúng ta cần nhớ rằng bộ vi xử lí sẽ có vài Execution Unit làm việc song song với nhau .
Chúng ta cũng nói rằng có vài kiểu Execution Unit khác nhau như ALU , Execution Unit thông thường , loại FPU – dùng trong Execution Unit toán học .
Ví dụ : trong CPU có 06 unit thực hiện tính toán trong đó có 04 unit thông thường – ALU và 02 unit toán học – FPU . Nếu có chương trình theo lệnh như sau
1. Lệnh thông thường .
2. Lệnh thông thường .
3. Lệnh thông thường .
4. Lệnh thông thường .
5. Lệnh thông thường .
6. Lệnh thông thường .
7. Lệnh toán học
8. Lệnh thông thường .
9. Lệnh thông thường .
10. Lệnh toán học .
Điều gì sẽ xảy ra ? Dispath Unit ( hay còn gọi là Schedule Unit ) sẽ gửi 04 lệnh đầu tiên tới 04 ALU , sau đó tới lệnh thứ năm , CPU sẽ cần chờ để một ALU trong số 04 ALU được giải phóng để thực hiện lệnh tiếp theo , trong khi cả 04 ALU đang bận thực hiện công việc . Điều đó là không tốt bởi vì chúng ta đang còn 02 FPU đang sắn sàng và chúng còn đang nghỉ . Do đó CPU cùng với kiểu OOO ( tất cả CPU đều có đặc điểm này ) sẽ tìm tiếp lệnh tiép theo để xem nếu nó có thể gửi tới một thành phần (Unit) đang nghỉ . Trong ví dụ trên , nó không thể dược bởi vì lệnh thứ 6 cũng cần xử lí bởi ALU . Nhưng OOO tiếp tục tìm và tìm ra lệnh thứ 7 là lệnh toán học được thực hiện bởi một FPU . Khi đó vẫn còn một FPU đang nghỉ , nó sẽ xuống dưới chương trình để tìm một lệnh toán học khác . Trong ví dụ trên nó sẽ qua lệnh thứ 8 và thứ 9 và sẽ tải lệnh thứ 10 .
Do đó trong ví dụ của chúng ta , những Execution Unit sẽ xử lí đồng thời cùng một lúc : lệnh thứ nhất , thứ hai , thú ba , thứ tư , thứ 7 và thứ mười cùng một lúc .
Cái tên Out-Of-Order đến từ một thực tế rằng CPU không cần chờ , nó có thể kéo một lệnh ở dưới cùng của chương trình và xử lí nó trước những lệnh ở trên nó đang chờ xử lí . Tất nhiên OOO không thể tìm mãi mãi những lệnh mà nó có thể tìm được . Phần OOO của tất cả CPU có thể tìm kiếm một số lượng lệnh nhất định ( thông thường là 512 ).
Thực hiện suy đoán – Speculative Execution
Mục đính của phần này là lệnh thông thường rẽ nhánh có điều kiện . OOO sẽ làm gì ? Nếu CPU có đặc điểm gọi là thực hiện suy đoán )speculative execution) – đa phần CPU đều có , nó sẽ thực hiện cả hai nhánh .
Chúng ta theo ví dụ dưới đây :
1. Lệnh thông thường .
2. Lệnh thông thường .
3. Nếu a=
4. Lệnh thông thường .
5. Lệnh thông thường .
6. Lệnh thông thường .
7. Lệnh toán học .
8. Lệnh thông thường .
9. Lệnh thông thường .
10. Lệnh toán học .
….
….
15. Lệnh toán học .
16. Lệnh thông thường .
Khi phần OOO phân tích chương trình nó sẽ kéo lệnh 15 vào một FPU , khi đó một FPU sẽ chờ ( ví dụ có 02 FPU Unit ) . Lúc đó chúng ta có thể có hai nhánh để xử lí cùng một lúc . Nếu CPU kết thúc lệnh thứ 3 mà a>b thì CPU sẽ huỷ xử lí lệnh 15 . Chúng ta có thể nghĩ như vậy là phí thời gian , nhưng trên thực tế không phải như vậy . Nếu a=