Kiutisuperking’s Weblog

Vi Kien Thuc La Bien Rong

Nền tảng kiến trúc Core của Intel

Posted by kiutisuperking on Tháng Sáu 8, 2008

Kiến trúc Core của Intel đã xuất hiện vào năm 2006, đây là kiến trúc được sử dụng trên tất cả các CPU mới vào thời điểm này của Intel như Merom, Conroe và Woodcrest. Kiến trúc mới này được xây dựng trên kiến trúc của Pentium M và có thêm một số tính năng mới. Trong hướng dẫn này chúng tôi sẽ giới thiệu cho các bạn về kiến trúc Core này của Intel nhằm trang bị thêm cho các bạn một số kiến thức về phần cứng máy tính.

Thứ đầu tiên mà bạn cần phải lưu ý đó là phần tên, kiến trúc Core không có liên quan gì với các CPU Core Solo và Core Duo của Intel. Core Single là một CPU Pentium M được sản xuất ở công nghệ 65 nm, còn các CPU Core Duo – trước đây được gọi là Yonah – là loại CPU dual-core công nghệ 65 nm dựa trên kiến trúc của Pentium M.

Pentium M được xây dựng trên kiến trúc thế hệ thứ 6 của Intel, kiến trúc này cũng được sử dụng trong các CPU Pentium Pro, Pentium II, Pentium III và các CPU trước đây của Celeron chứ không phải trên Pentium 4 như bạn vẫn nghĩ, ý tưởng ban đầu được nhắm đến các máy tính di động. Nếu bạn có thể nghĩ Pentium M là một Pentium III nâng cao thì cũng có thể nghĩ kiến trúc Core là một Pentium M nâng cao.

Tuy vậy để có thể đọc được hướng dẫn này bạn cần phải đọc hai hướng dẫn khác mà chúng tôi đã giới thiệu cho các bạn đó là Tìm hiểu cách làm việc của CPU và Bên trong kiến trúc Pentium M. Hướng dẫn đầu tiên chúng tôi giới thiệu một cách cơ bản về cách làm việc của CPU còn trên hướng dẫn thứ hai là giới thiệu về cách Pentium M làm việc như thế nào. Trong hướng dẫn này chúng tôi thừa nhận rằng bạn đã có những kiến thức ở trong cả hai hướng dẫn trên. Cũng rất tốt với các bạn đã có kiến thức am hiểu nữa về kiến trúc Pentium 4, vì các bạn có thể so sánh giữa hai kiến trúc với nhau nhằm hiểu sâu hơn về hai kiểu kiến trúc này.

Kiến trúc Core sử dụng cấu trúc 14 tầng. Cấu trúc này là một danh sách tất cả các tầng mà một chỉ lệnh được cho phải trải qua khi thực thi hoàn tất. Intel đã không tiết lộ cấu trúc của Pentium M và chính vì vậy cho tới nay họ vẫn chưa công bố những chỉ dẫn của mỗi tầng trong kiến trúc Core. Do đó chúng tôi cũng không thể cung cấp nhiều thông tin chi tiết hơn. Pentium III đã sử dụng cấu trúc 11 tầng, Pentium 4 ban đầu có 20 tầng và các CPU Pentium 4 mới hơn dựa trên lõi “Prescott” được biết có đến 31 tầng.

Bây giờ chúng ta hãy nói về một số điểm khác trong kiến trúc Core của Pentium M.

Cache nhớ và khối tìm nạp

Hãy nhớ rằng Cache nhớ là bộ nhớ tốc độ cao (SRAM) được nhúng vào bên trong CPU, sử dụng để lưu dữ liệu mà CPU có thể cần đến. Nếu dữ liệu được yêu cầu bởi CPU không có trong Cache nhớ thì nó sẽ phải truy cập vào bộ nhớ RAM chính, điều này sẽ làm giảm tốc độ của CPU vì bộ nhớ RAM được truy vập bằng sử dụng tốc độ clock ngoài của CPU. Ví dụ, trên một CPU 3,2GHz, Cache nhớ được truy cập ở tốc độ 3,2GHz nhưng bộ nhớ RAM chính chỉ được truy cập ở tốc độ clock 800MHz.

Kiến trúc Core được tạo bằng việc có khái niệm multi-core, nghĩa là có nhiều chip trên một đóng gói. Trên Pentium D, phiên bản dual-core của Pentium 4, mỗi core đều có Cache nhớ L2 của riêng nó. Vấn đề với hai Cache riêng ở đây là tại một thời điểm nào đó khi một lõi này sử dụng hết Cache nhớ trong khi lõi kia lại không sử dụng hết hiệu suất trên Cache nhớ L2 của riêng nó. Khi xảy ra điều này thì lõi đầu tiên phải truy cập và lấy dữ liệu từ bộ nhớ RAM chính, thậm chí Cache nhớ L2 của lõi thứ hai là hoàn toàn trống rỗng mà lẽ ra có thể được sử dụng để lưu dữ liệu, tránh tình trạng lõi phải truy cập trực tiếp vào bộ nhớ RAM chính.

Đối với kiến trúc Core, vấn đề này đã được giải quyết. Cache nhớ L2 được chia sẻ, có nghĩa là cả hai lõi đều có thể sử dụng Cache nhớ L2 một cách chung nhau, cấu hình động sẽ được thực hiện cho mỗi Cache. Ví dụ với một CPU có 2 MB L2 cache, một lõi có thể đang sử dụng 1,5MB còn lõi kia sử dụng 512 KB (0.5 MB), ngược lại với tỷ lệ chia cố định 50-50 như đã được sử dụng trước đây trong các CPU dual-core.

Khối tiền tìm nạp được chia sẻ giữa các lõi, nghĩa là nếu hệ thống Cache nhớ đã nạp một khối dữ liệu để được sử dụng bởi lõi đầu tiên thì lõi thứ hai cũng có thể sử dụng dữ liệu đã được nạp trên Cache này rồi. Trong các kiến trúc trước, nếu lõi thứ hai cần dữ liệu giống như dữ liệu đã được nạp vào Cache của lõi đầu tiên thì nó vẫn phải truy cập thông qua bus ngoài (điều đó khiến CPU làm việc ở tốc độ clock ngoài, có tốc độ clock thấp hơn tốc độ clock trong) hoặc thậm chí lấy dữ liệu cần thiết trực tiếp từ bộ nhớ RAM của hệ thống.

Intel cũng đã cải thiện khối tiền tìm nạp của CPU, đưa ra các mẫu theo cách mà CPU hiện đang lấy dữ liệu từ bộ nhớ để đoán thử dữ liệu mà CPU sẽ tìm nạp tiếp theo là gì và nạp nó vào Cache nhớ trước khi CPU yêu cầu. Ví dụ, nếu CPU đã nạp dữ liệu từ địa chỉ 1, sau đó yêu cầu dữ liệu trên địa chỉ 3 và sau đó yêu cầu tiếp dữ liệu trên địa chỉ 5 thì khối tiền tìm nạp sẽ đoán rằng chương trình sẽ nạp dữ liệu từ địa chỉ 7 và nó sẽ nạp từ địa chỉ này ra Cache nhớ trước khi CPU yêu cầu đến nó. Quả thực ý tưởng này không có gì mới mẻ và tất cả các CPU từ Pentium Pro sẽ dụng một số kiểu dự đoán để cung cấp Cache nhớ L2. Trên kiến trúc Core, Intel đã có một chút nâng cao về tính năng này bằng cách tạo ra một khối tiền tìm nạp tìm kiếm các mẫu trong dữ liệu tìm nạp thay vì các bộ chỉ thị tĩnh của dữ liệu mà CPU sẽ yêu cầu tiếp theo.

Bộ giải mã chỉ lệnh: Macro-Fusion

Một khái niệm mới được giới thiệu trong kiến trúc Core đó là macro-fusion. Macro-fusion là khả năng gắn (joining) hai chỉ lệnh x86 vào thành một chỉ lệnh micro-op. Cách làm này có thể cải thiện được hiệu suất của CPU và tiêu tốn ít năng lượng của CPU hơn vì nó sẽ chỉ thực thi một chỉ lệnh micro-op thay vì hai.

Mặc dù vậy cơ chế này lại bị hạn chế đối với các chỉ lệnh so sánh và các chỉ lệnh rẽ nhánh có điều kiện (có nghĩa là các chỉ lệnh CMP và TEST và Jcc). Ví dụ, chúng ta hãy xem đoạn chương trình dưới đây:


load eax, [mem1]
cmp eax, [mem2]
jne target

Đoạn chương trình này sẽ thực hiện nạp thanh ghi 32 bit EAX bằng dữ liệu được chứa trong vị trí nhớ 1, so sách giá trị của nó với dữ liệu có trong vị trí nhớ 2 và nếu chúng khác nhau thì (jne = jump if not equal), thì chương trình sẽ truy cập vào địa chỉ “target”, còn nếu bằng nhau thì chương trình sẽ tiếp tục trên vị trí hiện hành.

Với macro-fusion, các chỉ lệnh so sánh (cmp) và rẽ nhánh (jne) sẽ được hợp nhất vào một chỉ lệnh micro-op. Chính vì vậy sau khi chuyển qua bộ giải mã chỉ lệnh, phần chương trình này sẽ giống như dưới đây:


load eax, [mem1]
cmp eax, [mem2] + jne target

Như những gì thấy ở trên, chúng ta đã lưu một chỉ lệnh. Càng ít chỉ lệnh được thực thi thì máy tính của bạn sẽ thực hiện việc thực thi nhiệm vụ nhanh hơn và tốn ít công suất tiêu thụ hơn.

Bộ giải mã chỉ lệnh có trên kiến trúc Core có thể giải mã 4 chỉ lệnh trên một chu kỳ clock, trong khi đó ở các CPU trước như Pentium M và Pentium 4 thì chỉ có thể giải mã được đến 3.

Ở đây bộ giải mã chỉ lệnh của kiến trúc Core kéo đến 5 chỉ lệnh mỗi lần vào hàng đợi chỉ lệnh, thậm chí nó còn có thể giải mã đến 4 chỉ lệnh trên một chu kỳ clock. Chính vì vậy nếu hai trong số 5 chỉ lệnh được nối thành một thì bộ giải mã vẫn có thể giải mã bốn chỉ lệnh trên một chu kỳ clock. Và nó sẽ ở chế độ nhàn rỗi cục bộ bất cứ khi nào macro-fusion xảy ra, nghĩa là bộ giải mã sẽ chỉ cung cấp ba chỉ lệnh nối micro-op ở đầu ra của nó trong khi có khả năng cung cấp đến bốn.

Trong hình 1 bên dưới bạn có thể thấy những thông tin tóm tắt mà chúng tôi đã giải thích ở trên.

Hình 1: Khối tìm nạp và bộ giải mã chỉ lệnh trong kiến trúc Core

Khối thực thi

Pentium M có 5 cổng gửi đi được đặt trên trạm dành riêng Reservation Station của nó, nhưng chỉ có hai cổng được sử dụng để gửi đi các chỉ lệnh micro-ops đến các khối thực thi. Ba chỉ lệnh còn lại được sử dụng bởi các khối có liên quan đến bộ nhớ (Load, Store Address và Store Data). Kiến trúc Core cũng có 5 cổng gửi đi như vậy nhưng ba trong số chúng được sử dụng cho việc gửi các chỉ lệnh nối micro-ops đến các khối thực thi. Điều đó có nghĩa rằng các CPU đang sử dụng kiến trúc Core đó có thể gửi ba chỉ lệnh micro-ops đến khối thực thi trên một chu kỳ clock.

Kiến trúc Core cung cấp một FPU mở rộng và một IEU mở rộng (ALU) khi chúng ta mang ra so với kiến trúc Pentium M. Điều này có nghĩa rằng kiến trúc Core có thể xử lý đến ba chỉ lệnh số nguyên trên một chu kỳ clock, trong khi Pentium M chỉ có hai.

Tuy nhiên không phải tất cả các chỉ lệnh toán học đều có thể được thực thi trên tất cả các FPU. Như những gì bạn có thể quan sát được trong hình 2, các toán tử nhân floating-point chỉ có thể được thực thi trong FPU thứ ba và phần thêm vào floating-point chỉ có thể được thực thi trên FPU thứ hai. Các chỉ lệnh Fpmov có thể được thực thi trên FPU thứ nhất hoặc trên hai FPU khác nếu không có chỉ lệnh phức tạp hơn (FPadd or FPmul) đã sẵn sàng được gửi đến chúng. Các chỉ lệnh MMX/SSE đều được xử lý bởi FPU.

Trong hình 2 bạn sẽ thấy sơ đồ khối chính của các khối thực thi trong kiến trúc Core.

Hình 2: Các khối thực thi trong kiến trúc Core

Một sự khác nhau lớn giữa hai kiến trúc Pentium M và Pentium 4 với kiến trúc Core là trên kiến trúc Core, các khối Load và Store có khối tạo địa chỉ của riêng nó nhúng trong. Pentium 4 và Pentium M có các khối tạo địa chỉ riêng và trên Pentium 4 ALU đầu tiên được sử dụng để lưu dữ liệu trên bộ nhớ.

Dưới đây là những giải thích nhỏ về những khối có trong CPU này:

IEU: Instruction Execution Unit là nơi các chỉ lệnh được thực thi. Khối này cũng được biết đến là khối ALU (Arithmetic and Logic Unit). Các chỉ lệnh thông thường cũng được biết là các chỉ lệnh số nguyên.
JEU: Jump Execution Unit xử lý rẽ nhánh và cũng được biết đến với tên Branch Unit.
FPU: Floating-Point Unit. Khối này chịu trách nhiệm cho việc thực thi các biểu thức toán học floating-point và cũng cả các chỉ lệnh MMX và SSE. Trong CPU này, các FPU không “hoàn thiện” vì một số kiểu chỉ lệnh (FPmov, FPadd và FPmul) chỉ được thực thi trên các FPU nào đó:
FPadd: Chỉ có FPU này mới có thể xử lý các chỉ lệnh cộng floating-point như ADDPS.
FPmul: Chỉ có FPU này mới có thể xử lý các chỉ lệnh nhân floating-point như MULPS
FPmov: Các chỉ lệnh cho việc nạp hoặc copy một thanh ghi FPU, như MOVAPS (được dùng để truyền tải dữ liệu đến thanh ghi SSE 128-bit XMM). Kiểu chỉ lệnh này có thể được thực thi trên các FPU, nhưng chỉ trên các FPU thứ hai và thứ ba nếu các chỉ lệnh Fpadd hay Fpmul không có trong Reservation Station.
Load: khối này dùng để xử lý các chỉ lệnh yêu cầu dữ liệu được đọc từ bộ nhớ RAM.
Store Data: Khối này xử lý các chỉ lệnh yêu cầu dữ liệu được ghi vào bộ nhớ RAM.
Lưu ý rằng các chỉ lệnh phức tạp có thể mất đến một số chu kỳ clock trong khi xử lý. Chúng ta hãy lấy một ví dụ về cổng 2, nơi khối FPmul nằm ở đó. Khi khối này đang xử lý một chỉ lệnh rất phức tạp phải mất đến vài chu kỳ clock để được thực thi thì cổng 2 sẽ không chết: nó sẽ luôn gửi các chỉ lệnh đơn giản đến IEU trong khi FPU đang bận.

Đường dẫn 128-bit bên trong

Một tính năng khác có trong kiến trúc Core là đường dẫn dữ liệu 128 bit bên trong. Trong các CPU trước, đường dẫn dữ liệu bên trong chỉ có 64bit. Đây là một vấn đề đối với các chỉ lệnh SSE, chỉ lệnh được gọi là XMM có dài 128 bit. Chính vì vậy khi thực thi một chỉ lệnh đã biến đổi thành 128 bit dữ liệu thì toán tử này được chia thành hai toán tử 64bit.

Đường dữ liệu 128 bit mới làm cho kiến trúc Core trở nên nhanh hơn trong việc xử lý các chỉ lệnh SSE có 128 bit dữ liệu.

iến trúc nhớ mới

Kiến trúc nhớ mới là kỹ thuật tăng tốc thực thi các chỉ lệnh có liên quan đến bộ nhớ.

Tất cả các CPU của Intel từ Pentium Pro đều có cơ chế không tuân theo trình tự (out-of-order), cơ chế này cho phép CPU có thể thực thi các chỉ lệnh không phụ thuộc theo bất cứ một thứ tự nào. Những gì xảy ra với các chỉ lệnh liên quan đến bộ nhớ được thực thi theo kiểu truyền thống diễn ra theo một thứ tự giống hệt với thứ tự chúng xuất hiện trong chương trình. Ví dụ, nếu chương trình gốc có một chỉ lệnh như “store 10 at address 5555” và sau đó là một chỉ lệnh “load data stored at 5555”, thì chúng sẽ không thể được đảo ngược (nghĩa là được thực thi không tuân theo thứ tự) hoặc chỉ lệnh thứ hai sẽ lấy sai dữ liệu, vì dữ liệu ở địa chỉ 5555 đã bị thay đổi bởi chỉ lệnh thứ nhất.

Những gì mà cơ chế kiến trúc nhớ mới thực hiện là định vị và thực thi các chỉ lệnh có liên quan đến bộ nhớ để có thể thực thi không theo thứ tự, tăng tốc độ thực thi của chương trình (chúng tôi sẽ giải thích thêm về điều này được thực hiện như thế nào).

Trong hình 3, bạn có một ví dụ về một CPU không có cơ chế nhớ này (nghĩa là tất cả các CPU không được xây dựng trên kiến trúc Core). Như những gì bạn có thể nhìn thấy, CPU phải thực thi các chỉ lệnh khi chúng xuất hiện trong chương trình gốc. Ví dụ, chỉ lệnh “Load4” không liên quan tới bất kỳ đến bộ nhớ nào và có thể được thực thi trước, mặc dù vậy nó vẫn phải đợi tất cả các chỉ lệnh khác.

Hình 3: CPU không có kiến trúc nhớ mới

Trong hình 4, bạn sẽ thấy cách chương trình trong hình 3 làm việc như thế nào trên CPU có kiến trúc Core. Nó “biết” rằng chỉ lệnh “Load4” không có liên quan đến các chỉ lệnh khác và có thể được thực thi trước.

Hình 4: CPU với cơ chế nhớ mới.

Điều này đã cải thiện được hiệu suất của CPU vì lúc này chỉ lệnh “Load4” sẽ được thực thi ngay từ đầu, CPU có dữ liệu cần thiết cho việc thực thi các chỉ lệnh khác cần đến giá trị “X” để được thực thi.

Trong các CPU thông thường, nếu sau khi chỉ lệnh “Load4” này có chỉ lệnh “Add 50”, thì chỉ lệnh “Add 50” (và tất cả các chỉ lệnh khác phụ thuộc vào kết quả đó) sẽ phải đợi các chỉ lệnh khác như đã thể hiện trong hình 3 để được thực thi. Với kiến trúc nhớ mới này, các chỉ lệnh đó có thể được thực thi sớm, vì CPU lúc này sẽ có được giá trị “X” từ sớm.

Điều chỉnh tiết lưu công suất

Với việc điều chỉnh tiết lưu công suất tiên tiến, kiến trúc Core làm tiết kiệm được nhiều năng lượng tiêu thụ hơn so với các CPU trước đó. Tính năng này cho phép CPU có thể tắt các khối đang không được sử dụng ở thời điểm đó. Ý tưởng này thậm chí còn cho phép nhiều ưu việt hơn vì khi CPU có thể tắt các phần cụ thể bên trong mỗi khối CPU để tiết kiệm năng lượng, tốn ít công suất và cải thiện được thời gian sử dụng của pin (trong trường hợp xét đến các CPU di động).

Một khả năng tiết kiệm năng lượng khác của kiến trúc Core là chỉ bật các bit cần thiết trong các bus bên trong CPU. Nhiều bus bên trong của CPU được kích thước một cách cồng kềnh và lãng phí. Chính vì vậy thay cho việc bật tất cả ví dụ 480 làn dữ liệu của một bus nào đó thì CPU có thể chỉ cần bật 32 làn dữ liệu của nó, tất cả các dữ liệu trong làn đó đều cần thiết cho việc truyền tải chỉ lệnh 32bit.

* Có thể hơi khó hiểu ở tuyên bố này, vì bạn vẫn thường nghe thấy rằng kiến trúc của Intel sử dụng các chỉ lệnh 32bit, vì vậy chúng tôi cần đưa ra giải thích này để làm sáng tỏ vấn đề.

Bên trong CPU, những gì được xem xét ở một chỉ lệnh là mã thao tác (opcode) của chỉ lệnh đó (ngôn ngữ máy tương đương với ngôn ngữ chỉ lệnh assembly) cộng với tất cả các dữ liệu được yêu cầu. Điều này là vì để được thực thi, chỉ lệnh phải nhập vào cơ chế thực thi “hoàn tất”, nghĩa là cùng với tất cả các dữ liệu được yêu cầu. Cũng theo cách đó, kích thước của mỗi mã thao tác chỉ lệnh x86 là một biến và không cố đinh là 32bit như những gì bạn vẫn nghĩ. Ví dụ, một chỉ lệnh “mov eax, (32-bit data)”, dùng để lưu (32-bit data) và thanh ghi EAX của CPU được xem xét bên trong như một chỉ lệnh 40bit (mov eax dịch vào 8-bit opcode cộng với 32bit dữ liệu). Việc các chỉ lệnh có số chiều dài khác nhau là những gì đặt trưng cho tập chỉ lệnh CISC (Complex Instruction Set Computing).

(Nguồn: phancung.vn)

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

 
%d bloggers like this: