1. Giới thiệu
Trong phần này chúng ta sẽ xem qua cấu trúc bên trong của bộ vi xử lí AMD64 được sử dụng trong Athlon 64, Athlon 64 X2, Athlon 64 FX, Opteron, Turion 64 và một vài kiểu Sempron .
Cấu trúc này có tên gọi như K8 hoặc Hammer , chúng ta sau khi xem cấu trúc bên trong của nó và so sánh với cấu trúc bên trong của bịi vi xử lí Intel .
Sự khác nhau chính giữa cấu trúc AMD64 và những bộ vi xử lí được thiết kế trước đó của AMD như AthlonXP và Athlon đầu tiên ở chỗ phần điều khiển bộ nhớ được đi kèm bên trong CPU mà không thông qua Chip North Bridge ( Chip chính của Chipset trên Mainboard ) . Do đó Mainboard được sản xuất cho bộ vi xử lí dựa trên cấu trúc AMD64 thì Chip “North Bridge” là cầu nối giữa CPU và Bus đồ hoạ (AGP hoặc PCI Express) và Chip “South Bridge” . Từ khi Chip “North Bridge” được sản xuất đơn giản hơn thì một vài nhà sản xuất chỉ còn một Chipset trên Mainboard cho kiểu CPU của AMD64.
Từ khi phần điều khiển bộ nhớ được đi kèm bên trong CPU , dung lượng của bộ nhớ – bao gồm kiểu bộ nhớ được hỗ trợ và hỗ trợ Dual Channel – phụ thuộc vào CPU mà không còn phụ thuộc vào North Bride ( không còn phụ thuộc vào Mainboard ) như đã từng xảy ra với những Mainboard sử dụng CPU có cấu trúc khác . Như vậy đối với Mainboard dùng CPU dựa trên cấu trúc AMD64 mà không tích hợp Video on-board thì không có những tính năng khác của Mainboard được quan tâm đến . đối với những Mainboard dùng CPU dựa trên cấu trúc AMD64 có tích hợp Card màn hình on-board thì chỉ có tính năng của phần Card màn hình là được quan tâm đến .
Hình dưới đây là cấu trúc được dùng dựa trên CPU khác
Hình dưới đây là cấu trúc được dùng dựa trên bộ vi xử lí AMD64
Chúng ta có thể nói rằng Chip “North Bridge” được gắn bên trong CPU . Trên Mainboard chúng ta sẽ tìm thấy Chip ” Bridge” mà sẽ phù hợp giao diện giữa Bus “HyperTransport” ( có nghĩa là CPU ) với Bus của card đồ hoạ (AGP hoặc PCI Express x16) và Chip “South Bridge” . Đôi khi nhà sản xuất Mainboard họ đưa ra một Chip duy nhất gọi là “Single-chip Solution” bao gồm Chip ” Bridge” và Chip “South Bridge” .
Phần điều khiển bộ nhớ được đi kèm bên trong bộ vi xử lí AMD64 có thể điều khiển tới 04 thanh nhớ / kênh . Do vậy hệ thống Dual – Channel có thể điều khiển 08 thanh nhớ . Số của khe cắm được có sẵn trên Mainboard là giới hạn bởi nhà sản xuất Mainboard .
2. Bus HyperTransport và Đa xử lí
Sự trao đổi thông tin giữa CPU AMD64 và Chip ” Bridge” được thực hiện bởi Bus có tên là HyperTransport . Tốc độ HyperTransport phụ thuộc vào kiểu của CPU . Giá trị thông thường là 3200MB/s hoặc 4000MB/s . Để hiểu kỹ hơn về HyperTransport bạn có thể xem riêng bài này trong trang Web của sửa máy tính .
Bộ vi xử lí AMD64 có thế có nhiều hơn một bus HyperTransport . Trong khi tất cả CPU AMD64 của thị trường máy tính để bàn và máy tính xách tay Athlon 64, Athlon 64 FX, Athlon 64 X2, Sempron và Turion 64 chỉ có 01 bus HyperTransport , thì kiểu CPU dùng AMD64 cho náy chủ và máy trạm làm việc – Opteron – có nhiềuhơn 01 bus HyperTransport .
Bộ vi xử lí Opteron có series 1xx không hỗ trợ Đa xử lí và chỉ có 01 bus HyperTransport như hình trên ( ở phần 1) .
CPU Opteron 2xx hỗ trợ đa xử lí tới 02 CPU và có 02 Bus HyperTransport .
CPU Opteron 8xx hỗ trợ đa xử lí tới 08 CPU có 03 Bus HyperTransport . Những Bus thêm vào để dùng kết nối bên trong những CPU với nhau , chúng ta có thể xem hình dưới đây .
Cấu hình Opteron 2xx hoặc 8xx có Dual-CPU và Đa xử lí
Cấu hình Đa xử lí Opteron 8xx có 04 CPU
Cấu hình đa xử lí Opteron 8xx có 08 CPU
Quan điểm của AMD về vấn đề Đa xử lí cũng rất được đáng quan tâm .
Mỗi một CPU có phần điều khiển bộ nhớ của nó , mỗi CPU truy cập vào những thanh nhớ riêng biệt .
Ví dụ : trong hệ thống 04 Opterron có 4GB bộ nhớ thì mỗi một CPU có điều khiển riêng 1GB nhớ . Trong hệ thống Opteron có 04 CPU 4GB được chia cho tất cả CPU . Như thế mỗi một CPU có thể điều khiển tới 04 thanh nhớ / kênh và 04 CPU có thể điều khiển trực tiếp tới 32 thanh nhớ ( 08 thanh / CPU ) . Nhà sản xuất Mainboard thiết kế số khe cắm RAM sẵn sàng trên Mainboard ( có nghĩa là có thể nói rằng hệ thống Opteron 04 CPU có thể có tới 32 thanh nhớ mà không thể nói rằng tất cả hệ thống Opteron 04 PCU có 32 khe cắm RAM ).
Trong hình trên chúng ta có thể thấy phần “I/O ” . I/O này đại diện cho mỗi kiểu của Bridge , thông thường là South Bridge , nó có thể là Bridge của Card đồ hoạ AGP hoặc PCI Express x16 , nó cũng có thể là PCI-X hoặc PCI Express cho mục đích Card Add-on ….
Bus HyperTransport được kết nối bên trong CPU theo hình dưới đây
Bộ vi xử lí AMD64 có “Crossbar” , ở đó là đường nạp dữ liệu và những lệnh từ và tới CPU , bộ nhớ và với Bus HyperTransport .
System Request Interface (SRI) cũng được gọi là System Request Queue (SRQ), trong khi APIC là Advanced Programmable Interrupt Controller .
3. Socket của CPU
CPU AMD64 có vài kiểu Socket khác nhau . Chúng ta phải dùng Mainboard có cùng kiểu Socket với CPU mà chúng ta có .
Những kiểu Socket khác nhau bởi vì những tính năng khác nhau của phần điều khiển bộ nhớ .
- Socket 754 : phần điều khiển bộ nhớ DDR và Single – Channel , có nghĩa là điều khiển bộ nhớ truy cập bộ nhớ 64-bit . được sử dụng đầu tiên cho kiểu Athlon64 , Turion64 và kiểu Sempron socket 754.
- Socket 939 : điều khiển bộ nhớ DDR và Dual – Channel , điều khiển bộ nhớ truy cập 128-bit . được sử dụng kiểu Athlon 64, Athlon 64 X2, Athlon 64 FX và một vài dòng Opteron 1xx.
- Socket 940 : điều khiển bộ nhớ DDR và Dual – Channel yêu cầu bộ nhớ ECC . được dùng trong Opteron và những kiểu đầu tiên của Athlon 64 FX.
- Socket AM2 : điều khiển bộ nhớ DDR2 và Dual – Channel . Được dùng cho những sản phẩm sắp tới của Athlon 64, Athlon 64 X2 và Athlon 64 FX .
Hình dưới đây là Socket của CPU và trên Mainboard
Socket 754
Socket 939
4. Những đặc điểm chính AMD64
Từ khi phát hành Athlon64 , cấu trúc AMD64 đem lại nhiều kiểu 64-bit cho những lệnh của x86 .
Kiểu này gọi là x86-64 của AMD và nó làm để mở rộng những thanh ghi có sẵn 32-bit thành những thanh ghi 64-bit .
Tất cả bộ vi xử lí AMD64 có 16 thanh ghi 64-bit khi chạy kiểu x86-64 . Trong kiểu này bộ vi xử lí có bus địa chỉ được mở rộng từ 32-bit lên 40-bit , nó cho phép CPU có thể truy cập tới 1TB RAM ( 2^40 ) . Cũng trong kiểu này CPU có thể truy cập tới 256TB của bộ nhớ ảo ( 2^48 ) . Bộ nhớ ảo là công nghệ mà cho phép CPU mô phòng nhiều bộ nhớ RAM bằng cách tạo thành những file nháp trên ổ cúng gọi là Swap file .
Intel đã Copy tất cả những đặc điểm trên và họ không ngoại trừ bất kì đặc điểm nào của AMD . Mặc dù vậy những CPU AMD64 mà hỗ trợ kiểu x86-64 thì không phải tất cả bộ vi xử lí của Intel đều hỗ trợ đặc điểm đó . Để sử dụng đặc điểm này thì hệ điều hành phải chạy 64-bit .
Như chúng ta đã biết phần điều khiển nhớ của AMD64 làm việc trên công nghệ DDR hoặc DDR2 . Công nghệ Dual Data Rate làm việc bằng cáhc truyền 02 dữ liệu trong một chu kì đồng hồ . Do đó khi dùng Athlon64 có bộ nhớ DDR400/PC3200 , CPU truy cập với tần số xung nhịp đồng hồ 200MHz chứ không phải 400 MHz ( bộ nhớ DDR và DDR2 có tốc độ thực bằng 1/2 tốc độ ghi trên nhãn ) .
Tất cả CPU AMD64 có bộ nhớ Cache lệnh là 64KB và Cache dữ liệu là 64KB . Bộ nhớ cache L2 thì phụ thuộc vào kiểu của CPU . Trong bộ vi xử lí Dual-core thì cache L2 được tách rời có nghĩa là mỗi nhân sở hữu bộ nhớ cache L2 riêng biệt . Trong CPU của Intel dòng mới nhất ( Core Duo và Core 2 Duo ) bọ nhớ cache L2 được dùng chung và được chia xẻ tuỳ theo nhu cầu của mỗi nhân ( Intel tuyên bố đó là cải tiến để tăng hiệu suất làm việc ) .
5. Pipeline AMD64
Pipeline là danh sách của tất cả các tầng mà một lệnh phải đi qua một cách thứ tự để thực hiện một công việc được hoàn thành .
Cấu trúc AMD 64 dùng 12 tầng Pipeline đối với những lệnh thực hiện số nguyên và 17 tầng Pipeline đối với những phép tính thực hiện dấu phảy động . Dó đó nó sẽ cần 12 hoặc 17 bước để một lệnh đưa ra được thực hiện hoàn thành trong AMD64 .
Cấu trúc trước của AMD – K7 , được sử dụng Athlon , Athlon XP và một vài kiểu Sempron , có 10 tầng Pipeline . Pentium 4 có 20 tầng , Pentium 4 “Prescott” có 31 tầng . Intel quay trở lại những bộ vi xử lí sau này Core 2 Duo có 14 tầng Pipeline .
Chúng ta hãy nghiên cứu Pipeline số nguyên của AMD64 . Nó dựa trên Pipeline của cấu trúc K7 , sự khác nhau chính ở tầng Decoder ( giải mã ) mà nó sẽ phân thành vài tầng khác , chắc chắn cho phép những CPU AMD64 đạt được tốc độ đồng hồ cao hơn .
- Fetch : những lệnh được đưa tới từ bộ nhớ cache lệnh L1 thành những nhóm 16 byte ( 128 bit ) . Trong phần này thành 02 tầng . Tầng thứ hai được biết như là “Transit” – Sự đi qua , nó là hoạt đông jchính để chuyển dữ liệu bên trong CPU ( tương tự như tầng Drive của Pentium 4 )
- Pick : Fetch Unit gửi 128-bit mà đã được chuyển tới tầng này , cung cấp tới một bộ đệm được sẵn sàng ở đây . Những lệnh x86 không có độ dài cố định , trong tầng này CPU sẽ tìm và tách những lệnh hiện có bên trong bộ đệm . Nó cũng quyết định những lệnh x86 sẽ được gửi tới phần Decoder nào : tới Decode đơn giản ( nhanh ) được dùng những lệnh x86 chung mà chuyển đổi thành một hoặc hai vi lệnh , hoặc tới Decoder phức tạp ( chậm ) được dùng cho những lệnh x86 mà được chuyển đổithành vài vi lệnh . Tầng này được biết như là “Scan “
- Decode : ở đây những lệnh x86 được chuyểnthành những vi lệnh là nhân CPU có thể hiểu được . Trong phần này có 02 tầng.
- Pack : những cặp vi lệnh đã được giải mã được ghép thành một vi lệnh ở đây .
- Pack/Decode : một vài giải mã được làm ở đây trước khi vi lệnh được gửi tới Instruction Control Unit của AMD64 ( tương tự như ROB Reorder Buffer của Intel ).
- Dispatch : những vi lệnh được gửi tới Scheduler thích hợp trong tầng này .
- Schedule : những vi lệnh được lên danh sách để thực hiện một trong những Scheduler của CPU .
- AGU/ALU : những lệnh liên quan đến số nguyên và lên quan đến bộ nhớ được thực hiện ở đây .
- Data Cache : dú liệu được sinh ra trong Execution Unit được gửi tới bộ nhớ Cache L1 , những thanh ghi đầu tiên sẽ lưu được lưu trữ và lệnh được đánh dấu “executed” trong ROB . Phần này giống như “Retirement” trong CPU của Intel .
6. Bộ nhớ Cache và Fetch Unit
Trong cấu trúc AMD64 đường dữ liệu kết nối giữa bộ nhớ Cache L1 và L2 có độ rộng 128-bit . Trong bộ vi xử lí của Intel thuộc thế hệ thứ 7 ( Pentium 4 ) đường dữ liệu này có độ rộng 256-bit và trong CPU của Intel thuộc thhé hệ thứ 6 (Pentium Pro, Pentium II, Pentium III ) đường này rộng 64-bit .
Bộ nhớ cache lệnh L1 của CPU AMD64 bao gồm mạch logic Pre-decode , mỗi một byte lưu trữ bên trong bộ nhớ cache L1 có một vài bit để đánh dấu bắt đầu và kết thúc mỗi lệnh . Những lệnh x86 không có độ dài cố định ( chúng có thể có từ 1 đến 15 byte ) , quá trình xử lí để tách đâu là điểm đầu và đâu là điểm cuối là rất quan trong để CPU giải mã ( Decoder ) .
Cache lệnh L1 cung cấp 76 bit phụ tới Fetch Unit trong đó : 52 bit là Pre-decode , 08 bit chẵn lẻ và 16 phần chọn rẽ nhánh . Những bit chọn rẽ nhánh được CPU sử dụng để ccó gắng dự đoán trước những rẽ nhánh bên trong chương trình .
Do đó trên thực tế Cache L1 có dung lượng lớn hơn 64KB như thông báo vì có thêm những thông tin lưu trữ Pre-decode và thông tin rẽ nhánh .
Nó sẽ được tính là 102 KB gồm : 64KB cache lệnh + 4KB parity + 26 KB Pre-decode + 8KB dữ liệu rẽ nhánh .
Cấu trúc AMD64 dùng 2048 đầu vào BTB (Branch Target Buffer) , có cuìng kích thước với cấu trúc thế hệ trước CPU của AMD , K7 . BTB là bộ nhớ nhỏ mà chứa danh sách tất cả những rẽ nhánh được nhận biết bên trong chương trình .
BTB của Pentium 4 có 4096 đầu vào trong khi những bộ vi xử lí thuộc thế hệ thứ 6 của Intel phần đệm này có 512 đầu vào.
Thanh ghi rẽ nhánh khác BHT (Branch History Table) , được AMD gọi là GHBC (Global History Bimodal Counter) , có 16384 đầu vào trong cấu trúc AMD64 , trong khi Pentium 4 của Intel có 4096 đầu vào , có cùng kích thước với BHT của cấu trúc K7 của AMD . Thanh ghi này có 02-bit dùng để theo vết những rẽ nhánh có điều kiện ” có khả năng nhất ” , “có khả năng” , ” không có khả năng” và “không có khả năng nhất ” .
7. Decoder
Bộ vi xử lí của AMD dùng cấu trúc ghép lai CISC/RISC từ thế hệ thứ 5 ( có tên là K5 ) .
Intel bắt đầu dùng phương pháp này từ CPU thuộc thế hệ thứ 6 . CPU phải chấp nhận lệnh CISC , hay được gọi là x86 , từ hầu hết các chương trình ngày nay được sử dụng những lệnh này . Những bộ vi xử lí chỉ có RISC không được thiết kế cho PC bởi vì nó không chạy được những chương trình thông thường như : Windows , OFFICE ….
Do đo giải pháp được tất cả bộ vi xử lí trên thị trường ngày nay của AMD và Intel là dùng bộ giải mã ( Decoder ) . Bên trong CPU có những lệnh như là RISC , những đằng trước của Decoder chỉ có những lệnh CISC .
Những lệnh x86 CISC được gọi là ” lệnh ” , những lệnh bên trong của RISC gọi là “vi lệnh ” hoặc : “micro-op”, “µops” , “ROP”.
Cấu trúc AMD64 có kiểu lệnh thứ ba gọi là Macro-op hoặc “MOP” , nó là lệnh được tạo ra từ Giải mã lệnh . AMD64 thực hiện bên trong bằng những Macro-op . Khi những Macro-op được đưa tới những Scheduler thích hợp , nó đẩy nhanh giải mã thành những vi lệnh và sau đó những vi lệnh này được thực hiện .
Nếu chúng ta chú ý nhớ rằng một cái gì đó trong cấu trúc mới của Intel cũng được sử dụng kiểu Macro-op trên chính là đặc điểm Macro-fusion ( ghép hai vi lệnh thành một vi lệnh trong một thanh ghi có độ rộng gấp đôi ) . Những bộ vi xử lí có sử dụng Macro-fusion chỉ làm việc với những lệnh rẽ nhánh , còn trong AMD64 dùng Macro-op được dùng trong tất cả các lệnh .
Những vi lệnh RISC không thể truy cập trực tiếp , do chúng ta không tạo ra những phần mềm viết trên tập lệnh này , do đó những lệnh phải đi qua phần Decoder . Mỗi một CPU có tập vi lệnh RISC riêng và không tương thích với những vi lệnh từ CPU khác . Có nghĩa là vi lệnh của AMD65 khác với vi lệnh của Pentium 4 , khác với cấu trúc vi lệnh của K7 .
Tuỳ thuộc vào độ phức tạp của lệnh x86 , nó có thể chuyển đổi thành một vài vi lệnh RISC .
Trong cấu trúc AMD64 , những vi lệnh x86 có thể được chuyển đổi thành những Macro-op được sử dụng trong 03 phần khác nhau :
- Dùng Decoder đơn giản , gọi là DirectPath Single , mà chuyển một lệnh x86 thành một lệnh Macro-op .
- Cũng dùng Decoder đơn giản , gọi là DirectPath Double , chuyển đổi 01 lệnh x86 thành 02 Macro-op .
- Hoặc dùng Decoder phức tạp , gọi là DirectPath Vector , chuyển 01 lệnh x86 thành vài lệnh Macro-op .
Ở đây Decoder của AMD64 làm việc như thế nào ?
Trong tầng Pick , hoặc gọi là Scan , CPU tìm kiếm và tách những lệnh hiện thời trong Instruction Byte Buffer , quyết định phần nào sẽ được dùng DirectPath hoặc VectorPath .
Sau đó đến tầng giải mã Decode , được phân thành 02 bước , ở đây những lệnh x86 hiện tại được chuyển đổi thành những Macro-op . Tầng này tương đương với tầng Aligh của CPU K7 . Tốc độ giải mã lớn nhất ở đầu ra là 06 Macro-op / chu kì đồng hồ : 03 macro-op cho DirectPath và 03 macro-op cho VectorPath .
Những Macro-op đi tới tầng Pack ( tương đương với tầng Decode 1 của K7 ) , ở đó những lệnh Macro-op được gói lại với nhau , 03 Macro-op được gửi tới tầng tiếp theo – Pack/Decode – sau đó những Macro-op được gửi tới Instruction Control Unit ( tương đương với Reorder Buffer (ROB) của Intel .
8. Dispatch và Schedule
Như chúng ta đã đề cập Instruction Control Unit là ROB (Reorder Buffer) của bộ vi xử lí AMD64 . Ở đó những Macro-op được “nhặt” và gửi tới phần lên công việc OOO ( Out-Of-Order ) , có nghĩa là thực hiện công việc không theo thứ tự lệnh xuất hiện trong chương trình . Ví dụ nếu chương trình như sau :
Interger
Interger
Interger
Interger
FP
Interger
FP
Cấu trúc AMD64 có 03 Execution Unit thực hiện những phép tính liên quan đến số nguyên và cũng có 03 Execution Unit thực hiện những phép tính liên quan đến dấu phảy động . Nếu nó không thực hiện OOO thì những phần liên quan đến dấu phảy động sẽ nghỉ khi chạy chương trình này khi lệnh trước cũng là lệnh liên quan đến số nguyên không thể thực hiện cùng một lúc bởi vì cũng chỉ có 03 Execution Unit đang được sử dụng . Từ khi có sự cải tiến kiểu thực hiện OOO , lệnh thứ năm cũng là lệnh dấu phảy động (FP) đầu tiên ,có thể được gửi cùng thực hiện một lúc cùng với lệnh Interger đầu tiên , công việc này tăng hiệu suất của CPU .
Trên thực tế trong AMD64 có 03 FPU nên cả hai lệnh FP đã có trong chương trình trên sẽ được chuyển đi để thực hiện lệnh trong cùng một lúc . Mục đích của nó là làm cho CPU luôn luôn hoạt động trong tất cả thời gian .
ROB ( Reorder Buffer ) có sẵn trong cấu trúc AMD64 , nó có 72 đầu vào và một điều khá thú vị là mỗi một Execution Unit liên quan đến số nguyên có một vị trí cố định Scheduler trong đó ( 8 đầu vào / ALU ) . Những Execution Unit của FP chỉ duy nhất một khối Scheduler và có 36 đầu vào . Do đó tổng cộng trong AMD64 có 04 Scheduler , tương đương với Pentium 4.
ROB cũng cung cấp cho Register Renaming . Cấu trúc lệnh CISC x86 có 08 thanh ghi 32-bit (EAX, EBX, ECX, EDX, EBP, ESI, EDI và ESP) . Số này là quá ít , đặc biệt khi CPU thực hiện công việc kiểu OOO , nó sẽ phá huỷ nội dung của các thanh ghi và làm hỏng chương trình .
Do đó ở tầng này bộ vi xử lí sẽ thay đổi tên và nội dung của những thanh ghi được dùng trong chương trình thành một trong 96 thanh ghi , trogn khi Pentium 4 có 128 thanh ghi . Thế hệ thứ 6 bộ vi xử lí của Intel (Pentium II , Pentium III) chỉ có 40 thanh ghi trong .
Một điều chú ý đó là một thủ thuật nhỏ trong cấu trúc AMD64 chỉ cần 96 thanh ghi trong . Chúng tạo một cách đơn giản là một trường kết quả trong một hay 72 đầu vào của ROB để lưu trữ kết quả mỗi lệnh ( Pentium 4 không có việc này ; Pentium 4 cần chỉ định một thanh ghi bên trong để lưu trữ kết quả mỗi khi lệnh được thực hiện ) . Thêm vào đó File thanh ghi của nó ( hoặc IFFRF, Integer Future File and Register File, AMD gọi như vậy) có 40 đầu vào ( 16 trong số đó để lưu trữ giá trị “correct” cho mỗi thanh ghi x86 , chúng có thể không dùng ) . ==> 72 + 40 -16 = 96
9. Execution Unit
Cấu trúc AMD64 có 03 Execution Unit cho số nguyên ( hay còn gọi là ALU – Arithmetic and Logic Unit, hoặc IEU – Integer Execution Unit) , 03 AGU (Address Generation Unit ) và 03 FPU (Floating-Point Unit) .
Nó có nhiềuhơn 01 ALU so với Pentium 4 . Tốc độ chuyển lệnh cao nhất là 06 lệnh / chu kì đồng hồ , cùng tốc độ với Pentium 4
Như hình trên chúng ta thấy , chỉ có những lệnh FP chỉ có thể được xử lí trong FPU riêng biệt . FPAD cho những lệnh cộng dấu phảy động như lệnh ADDPS ( trong tập lệnh SSE ) trong khi FMUL thực hiện những lệnh nhân dấu phảy động như MULPS ( trong tập lệnh SSE )