2010-03-17 32 views
5

Tôi đang nghiên cứu thiết kế JIT liên quan đến ngôn ngữ động VM triển khai thực hiện. Tôi đã không làm nhiều hội từ những ngày 8086/8088, chỉ là một chút ở đây hoặc ở đó, vì vậy được tốt đẹp nếu tôi ra khỏi loại. Khi tôi hiểu nó, kiến ​​trúc x86 (IA-32) vẫn có cùng một bộ đăng ký giới hạn cơ bản ngày hôm nay mà nó luôn làm, nhưng số lượng đăng ký nội bộ đã tăng lên rất nhiều, nhưng các thanh ghi bên trong này thường không có sẵn và được sử dụng với đăng ký đổi tên để đạt được pipelining song song của mã mà nếu không thì không thể song song. Tôi hiểu tối ưu hóa này khá tốt, nhưng cảm giác của tôi là, trong khi các tối ưu hóa này giúp thông lượng tổng thể và các thuật toán song song, bộ đăng ký giới hạn chúng tôi vẫn bị kẹt với kết quả trong quá trình đăng ký tràn hơn, nếu x86 có gấp đôi hoặc tăng gấp bốn lần thanh ghi có sẵn cho chúng tôi, có thể có ít hơn đáng kể push/pop opcodes trong một dòng hướng dẫn điển hình? Hoặc là có optmizations xử lý khác mà cũng tối ưu hóa này đi mà tôi không biết? Về cơ bản nếu tôi có một đơn vị mã có 4 thanh ghi để làm việc với số nguyên, nhưng đơn vị của tôi có một tá biến, tôi có khả năng một push/pop cho mỗi 2 hướng dẫn.Kiến trúc P6 - Đăng ký đổi tên sang một bên, sổ đăng ký người dùng bị hạn chế có dẫn đến nhiều op hơn chi tiêu/tải không?

Mọi tham chiếu đến nghiên cứu hoặc trải nghiệm cá nhân tốt hơn chưa?

EDIT: x86_64 có 16 thanh ghi, gấp đôi x86-32, nhờ chỉnh sửa và thông tin.

Trả lời

9

Ngoài việc đổi tên sổ đăng ký để ẩn bong bóng do độ trễ lệnh, hầu hết các kiến ​​trúc x86 đều đủ thông minh để đếm đẩy và bật và đổi tên những người đăng ký. Hãy nhớ rằng bộ giải mã lệnh trên x86 thực sự thực hiện một loại trình biên dịch JIT, chuyển luồng lệnh x86 thành một chương trình vi mã nhỏ được lưu trữ trong bộ nhớ cache theo dõi. Một phần của quá trình này bao gồm chặn các tải chồng nhỏ bù đắp và chuyển chúng thành sổ đăng ký. Như vậy một cái gì đó tương tự (các ràng ngớ ngẩn và hoàn toàn ví dụ):

lwz eax,[ebp] 
lwz ebx,[ebp+4] 
add eax,[edx+0] 
push eax 
lwz eax,[ebp+8] 
add eax,ebx 
pop ebx 
add eax,ebx 

đầu bếp thành một cái gì đó tương tự (giả vờ thanh ghi bên trong được đặt tên ví dụ r0..r16):

lw r3, edx 
lw r1, ebp 
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand 
add r1,r2 
or r4,r1,r1 ;; move r1 to r4 
lw r1, ebp+8 
add r1,r2 
or r2,r4,r4 
add r1,r2 

Tất nhiên một cách kỳ diệu bộ giải mã thông minh (không giống như bộ giải mã thực sự phù hợp với số lượng transistor) sẽ sụp đổ một số động thái không cần thiết ở đó, nhưng điểm tôi tạo ra là push/pop và các cửa hàng/tải tới esp+(some small number) thực sự được chuyển thành sổ đăng ký bóng.

+0

Cảm ơn CrashWorks, câu trả lời tuyệt vời. Bạn có một tài liệu tham khảo tốt cho điều này? Tôi có một số cuốn sách kiến ​​trúc và không ai trong số họ đề cập đến điều này, nhưng đó là nghi ngờ của tôi rằng một cái gì đó như thế này đã xảy ra. – codenheim

+1

Bạn có thể suy ra nhiều thông tin này từ chương 2 của cẩm nang tối ưu hóa của Intel (http://www.intel.com/products/processor/manuals/). Bạn cũng có thể chạy một số thử nghiệm được kiểm soát để cố gắng tìm ra một số nội dung "hộp đen". Và bạn luôn có thể đi qua các bằng sáng chế của Intel: sau khi tất cả, mục đích của một bằng sáng chế là họ phải cho bạn biết làm thế nào nó hoạt động! # 5740414 có thể là một nơi để bắt đầu. – Crashworks

+0

Cảm ơn, các điểm tốt. Bước đầu tiên là đặt hàng các sách hướng dẫn mới hơn so với các tài liệu cũ 15 năm của tôi.:) – codenheim

4

Hai điểm:

(1) x86-64 tăng gấp đôi số lượng đăng ký để 16

(2) trong CPU x86 hiện đại, một hướng dẫn sử dụng một vị trí bộ nhớ đó là đã có trong bộ nhớ cache L1 là gần như nhanh như hoạt động tương tự với toán hạng đăng ký, vì vậy bạn gần như có thể nghĩ L1 là "bộ nhớ đăng ký"

+0

Re: (2) - Tôi đã hẹn giờ độ trễ của một hit L1 * trên i7 của tôi vào khoảng 9 chu kỳ, mà (đáng kinh ngạc) thực sự là chậm hơn so với Core Duo. – Crashworks

+0

Bạn đã làm thế nào? Nó chỉ nên là 2 chu kỳ trên một Core i7, tôi nghĩ rằng, mà không phải là một vấn đề trên một dòng hướng dẫn hợp lý tốt theo lịch trình. –

+0

Re: (1), thời gian để cập nhật sổ tay phần cứng của tôi. Tôi có 386, 486 và Pentium nhưng không có gì mới hơn. Nhờ cả hai bạn cho câu trả lời. – codenheim

Các vấn đề liên quan