Tại sao chúng ta không có nhiều thanh ghi trong bộ vi xử lý?


18

Đăng ký về mặt lý thuyết là không bắt buộc; tất cả các bộ vi xử lý vẫn sẽ làm việc mà không cần đăng ký. Nhưng sự bổ sung có vẻ tầm thường này đã giúp làm cho bộ vi xử lý hiệu quả hơn.

Tại sao chúng ta không thể có nhiều đăng ký hơn để trích xuất thêm lợi ích từ chúng? Chúng chỉ là bộ nhớ trên chip và người ta có thể tưởng tượng không khó để thêm vào? Yếu tố nào ảnh hưởng đến số lượng thanh ghi là những gì hiện tại và không, nói thêm gấp 10 lần?


8
@ Alper91 Nhiều kiến ​​trúc, giả thuyết và thực tế, không có đăng ký, và nó hoàn toàn không cần thiết. Nó chỉ đơn giản là một tối ưu hóa hữu ích.
ống

4
Hừm. Không ai nhắc đến Sparc. Việc triển khai lớn nhất có thể có 520 thanh ghi trong đó (32 cửa sổ nhân với 16 thanh ghi, + 8 toàn cầu.) Tôi chắc chắn nhớ chúng.
jonk

13
Tôi nghĩ rằng số bit trong hướng dẫn mà bạn cần chỉ định thanh ghi là một vấn đề lớn. Nếu bạn có 1024 thanh ghi, thì bạn cần ít nhất 30 bit cho mỗi lệnh số học - trừ khi bạn thêm các ràng buộc khác như "cả 3 thanh ghi phải từ cùng một nhóm 32 (trong trường hợp đó bạn cần 20 bit).
user253751

8
.... - hầu hết các ký ức không có ba cổng truy cập. Và một máy stack cần một con trỏ ngăn xếp là ... một thanh ghi! Và cho phép không đề cập đến đăng ký đường ống. Bạn có thể ẩn việc sử dụng các "thanh ghi" như vậy từ lập trình viên, nhưng bạn vẫn cần một số, và có thể gần như nhiều như một máy đăng ký nguyên thủy có.
Chris Stratton

4
@ChrisStratton Chắc chắn, nhưng miễn là chúng không được hiển thị thông qua ISA, nó chỉ đơn giản là một chi tiết triển khai. Một số tranh luận vô nghĩa mặc dù, vì chúng ta không biết OP có nghĩa là gì khi đăng ký .
đường ống

Câu trả lời:


33

Có một số yếu tố:

  • kiến trúc vi mô hiệu suất cao sử dụng đổi tên đăng ký. Đó là, số lượng các thanh ghi vật lý cao hơn số lượng các thanh ghi có thể nhìn thấy về mặt kiến ​​trúc và chúng có thể theo dõi việc sử dụng độc lập chúng.

  • nhân đôi số lượng thanh ghi không tăng gấp đôi hiệu suất. ISTR (từ Kiến trúc máy tính, Phương pháp định lượng ) đi từ 16 đến 32 thanh ghi mang lại một sự cải thiện 10% với giả định rằng sự gia tăng không có tác dụng phụ (đó là một giả định rất lạc quan).

  • đăng ký kiến ​​trúc có thể nhìn thấy có chi phí. Ví dụ:

    • Việc tăng số lượng của chúng làm tăng số lượng bit được lấy trong định dạng hướng dẫn để cho biết thanh ghi nào đang được thực hiện (tăng gấp đôi số lượng thanh ghi ngụ ý có thêm một bit cho mỗi thanh ghi trong định dạng, do đó ngăn không sử dụng các bit đó cho các mục đích sử dụng khác hoặc buộc một kích thước hướng dẫn dài hơn).
    • Việc tăng số lượng các thanh ghi kiến ​​trúc làm tăng chi phí chuyển đổi ngữ cảnh (vì chúng phải được lưu và khôi phục trên chuyển đổi ngữ cảnh).

1
Tôi muốn rằng việc cải thiện hiệu suất của 16 đến 32 thanh ghi phụ thuộc hoàn toàn vào tiềm năng tối ưu hóa của trình biên dịch được đề cập. Trong trình biên dịch chương trình, có quyền truy cập để tăng gấp đôi số lượng thanh ghi (trong kiến ​​trúc x64) có thể cải thiện đáng kể hiệu năng - nhưng chỉ cho các vai trò thích hợp và chỉ khi chúng thực sự được sử dụng.
ndtsc

6
@rdtsc: đi từ 8 đến 16 thanh ghi kiến ​​trúc mang lại sự cải thiện lớn về lượng tràn / tải lại cho mã thông thường, theo dữ liệu từ mô phỏng trong một bài báo được liên kết từ câu trả lời này . Nó ảnh hưởng đến kích thước mã, số lượng lệnh và mức độ quan trọng của việc chuyển tiếp cửa hàng có độ trễ thấp. 16-> 32 là một hiệu ứng nhỏ hơn nhiều. AFAICT, 16 thanh ghi kiến ​​trúc là một lựa chọn tốt cho phần cứng với việc đổi tên thanh ghi để loại bỏ các mối nguy WAR và WAW.
Peter Cordes

2
Tuy nhiên, AVX512 của Intel bổ sung thêm 16 regs vector, với tổng số 32. (Cũng như tăng gấp đôi chiều rộng của chúng lên 64 byte, một dòng bộ đệm đầy đủ). Việc che giấu độ trễ từ các hoạt động FP có độ trễ cao thông lượng cao có thể mất rất nhiều đăng ký. ví dụ: Intel Haswell có 5c lat, một FMA thông qua 0,5c, do đó bạn cần 10 bộ tích hợp véc tơ để bão hòa các đơn vị thực hiện FMA để giảm (ví dụ: sản phẩm chấm hoặc tổng hợp một mảng, trong đó FMA là một phần của phụ thuộc vòng lặp ). x86-64 chỉ có 16 regs vector. Nhưng hãy nhớ, số nguyên op, đặc biệt. trên GP regs, hiếm khi có độ trễ hơn 1c.
Peter Cordes

1
Sự đánh đổi là khác nhau đối với các thanh ghi số nguyên, FP và vector. Ví dụ, lười biếng lưu / khôi phục các thanh ghi số nguyên không có ý nghĩa, thực hiện nó cho vector một là đặt cược tốt hơn nhiều. Và vectơ ISA thường có nhiều thanh ghi hơn số nguyên (AltiVec có ít nhất tới 128, ISTR đã đọc khoảng 256 cái cho Sparc nhưng không thể tìm thấy tài liệu tham khảo ngay bây giờ).
AProgrammer

1
vi.wikipedia.org/wiki/AltiVec có ba mươi hai regs vector 128b. Tôi đã tò mò về SPARC và tìm kiếm cách các công cụ cửa sổ đăng ký của nó hoạt động cho các chuyển đổi ngữ cảnh. Nó có 32 thanh ghi hiển thị cùng một lúc, nhưng sử dụng cửa sổ trượt vào tệp đăng ký lớn hơn. Nghe có vẻ từ phiên bản đơn giản hóa này như HĐH cần biết kích thước của toàn bộ tệp thanh ghi cửa sổ trượt để lưu / khôi phục tệp, bởi vì mặc dù các hướng dẫn trượt cửa sổ cung cấp bộ nhớ để lưu / khôi phục regs nếu cần, nó được thực hiện bằng cách bẫy đến HĐH.
Peter Cordes

16

Mặc dù các thanh ghi và RAM đều là bộ nhớ, nhưng chúng được truy cập theo các cách khác nhau, để phản ánh chi phí (trong khu vực chip hoặc chu kỳ đồng hồ ẩn) của việc truy cập chúng.

Các thanh ghi được liên kết chặt chẽ với ALU và có thể đảm nhận nhiều vai trò của nguồn dữ liệu, phần chìm, bộ sửa đổi, v.v. Do đó, chúng cần rất nhiều kết nối đa kênh. Trong một số kiến ​​trúc, chúng ta có thể viết R1 <= R2 + R3 và đó chính xác là những gì xảy ra trong một chu kỳ đồng hồ duy nhất. Mỗi thanh ghi được gửi trực tiếp trong mã op, địa chỉ này là một tài nguyên rất hạn chế.

Vì các thanh ghi rất tốn kém để thực hiện, số lượng thường được giới hạn ở thứ tự 10/20 trong hầu hết các kiến ​​trúc.

RAM được liên kết lỏng lẻo với CPU, thường được chuyển qua một kết nối chung. Điều này làm cho nó rẻ hơn nhiều để thực hiện một lượng lớn RAM. Địa chỉ RAM thường đến từ một địa chỉ được lưu trữ đăng ký, vì vậy đừng tiêu tốn chiều rộng chỉ dẫn đáng kể.

SPARC là một kiến ​​trúc thú vị, với các thanh ghi 72 đến 640 64 bit, với bối cảnh thanh ghi 32 có thể được thay đổi với các lớp phủ cho các cuộc gọi chương trình con nhanh với thông số truyền qua. Bạn có xu hướng không tìm thấy chúng trong PC và máy chủ, nơi có vấn đề về chi phí, như trong 99,999% ứng dụng.


4
Một khía cạnh khác là bạn phải lưu / khôi phục các thanh ghi trong khi chuyển đổi ngữ cảnh. Đăng ký nhiều hơn, nhiều thời gian hơn.
Michel Billaud

Tôi sẽ lưu ý rằng TMS9900 cũ giữ tất cả các thanh ghi hoạt động của nó trong bộ nhớ ngoài en.wikipedia.org/wiki/Texas_Instrument_TMS9900
Peter Smith

1
Tôi đã đủ điều kiện 'luôn luôn' với (ngoại trừ một vài điều chỉnh) nhưng đã lấy nó ra để đơn giản hóa nó. Có lẽ tôi sẽ thay đổi nó thành 'nói chung'. Về cơ bản nếu bạn có thể tìm và hiểu các ngoại lệ, bạn không cần tôi chỉ ra chúng. Nếu bạn không đủ để bị lừa, thì điều đó không thành vấn đề, bởi vì nó sẽ không khiến bạn gặp rắc rối. TMS9900, điều đó thật tồi tệ, tôi đã có 99/4 cho những tội lỗi của mình ở kiếp trước, quái thú kỳ lạ!
Neil_UK

Itanium cũng có cửa sổ đăng ký.
Simon Richter

1
@ChrisStratton: Mặc dù có một số tiền lệ cho "bạn không thể sử dụng các thanh ghi X và Y" được coi là một phần của "ABI" (ví dụ: thanh ghi k0 và k1 trên mips), nhưng đó là cách sử dụng khác thường. Chắc chắn có các kênh nhắn tin bí mật không mong muốn / không an toàn giữa các quy trình nếu việc lưu / khôi phục các "thanh ghi bị cấm ABI" này không được thực hiện tại chuyển đổi ngữ cảnh. Đó là, các quy trình không thể giao tiếp có thể có thể thực hiện bằng cách lưu trữ thông tin trong các thanh ghi bị cấm và chờ chuyển đổi ngữ cảnh.
R ..

12

Đăng ký phải được quảng cáo trong hướng dẫn. Nếu có nhiều thanh ghi, hướng dẫn dài hơn. Lưu và khôi phục nội dung đăng ký cho một dịch vụ ngắt cần nhiều thời gian hơn nếu có nhiều đăng ký.


5

Như hầu hết mọi thứ, số lượng đăng ký là một sự thỏa hiệp giữa chi phí, độ phức tạp và tính hữu dụng.

Các thanh ghi được triển khai dưới dạng RAM tĩnh đa cổng, khiến chúng tốn kém hơn (diện tích chip) so với các tùy chọn lưu trữ khác.

Sau đó, chúng được kết hợp với tập lệnh của bộ xử lý, tăng số lượng thanh ghi làm tăng độ phức tạp của tập lệnh. Vì vậy, nếu bạn muốn duy trì khả năng tương thích với tập lệnh, bạn không thể tăng số lượng thanh ghi có sẵn trong thế hệ bộ xử lý tiếp theo để tăng hiệu quả, các chương trình sẽ không sử dụng chúng.

Tiếp theo là bạn cần bao nhiêu thanh ghi? Có một giới hạn cho tính hữu dụng của chúng. Hãy xem xét bạn viết một thuật toán thực hiện một số thao tác toán học trên 1024 byte, giả sử nhân với 5. Với số lượng đăng ký hiện tại, bạn kết thúc với một cái gì đó như:

load operand1=5
load address
loop: load operand2=byte1@address
multiply Register1 with Register2
store result
increment address
if address = end goto endLoop
jump loop
endLoop:

Bây giờ nếu bạn có 1024 thanh ghi và tất cả dữ liệu được lưu trữ ở đó, chương trình của bạn sẽ như sau:

multiply Register1 with Register2
multiply Register1 with Register3
multiply Register1 with Register4
multiply Register1 with Register5
multiply Register1 with Register6
...

Bởi vì mỗi người trong số họ là một hướng dẫn khác nhau, mỗi một trong số họ phải được viết ra. Vì vậy, bộ nhớ chương trình cần thiết của bạn đang bùng nổ. Sau khi nhận ra điều này, bạn có thể muốn giới thiệu một số hướng dẫn như , multiply register1 with register(2 to 256). Nhưng khi nào bạn dừng lại, bạn có cung cấp một hướng dẫn cho tất cả các kết hợp không?

Vì vậy, có thể những con số chúng tôi hiện có sẵn là một sự đánh đổi tốt giữa chi phí, độ phức tạp và tính hữu dụng.


1
Tôi nghĩ rằng chương trình multiply Register1 with Register2 multiply Register1 with Register3này rất phi thực tế vì dữ liệu phải được gửi trực tiếp hoặc gián tiếp từ bên ngoài máy tính, vì vậy các thanh ghi cần được tải và kết quả cần được sử dụng ở đâu đó, trực tiếp hoặc gián tiếp, vì vậy các thanh ghi cần được lưu trữ. Trong thực tế, một trình biên dịch tối ưu hóa tốt cho ngôn ngữ cấp cao sẽ 'hủy kết nối' vòng lặp của chương trình đầu tiên để tạo ra thứ gì đó giống như chương trình thứ hai, tối ưu hóa việc sử dụng thanh ghi, độ trễ bộ nhớ, có thể chiếm bộ nhớ cache và tốc độ thực thi.
xe cứu thương

1
Không cần nhiều multiply register1 with register(2 to 256)hướng dẫn mục đích đặc biệt . Pipelining cải thiện đáng kể thông lượng CPU, đặc biệt là để đơn giản hơn để giải mã và thực hiện các hướng dẫn. Vì vậy, hiệu quả của các hướng dẫn đa dạng, phức tạp có thể đạt được bằng cách sử dụng một số hướng dẫn đơn giản hơn với tỷ lệ thực hiện cao hơn. Có số lượng lớn hơn các thanh ghi giúp bằng cách cho phép trình biên dịch tạo ra nhiều hướng dẫn độc lập (những lệnh không chia sẻ một thanh ghi), có thể được hoàn thành độc lập, cải thiện thông lượng. Ví dụ của bạn = nhiều đăng ký là tốt hơn.
xe cứu thương

4

Đăng ký rất tốn kém. Rất đắt. Bản thân các thanh ghi không quá nhiều, đó là tất cả các kết nối từ và đến các thanh ghi. Giả sử bạn có một lệnh reg1 = reg2 + reg3. Để thực hiện nhanh điều này , bạn cần đọc dữ liệu từ hai thanh ghi trong một chu kỳ và ghi vào thanh ghi khác trong chu kỳ thứ hai. Bây giờ nếu bạn có bộ xử lý có thể thực thi nhiều lệnh trong mỗi chu kỳ, hãy nói ba hướng dẫn, bạn cần có thể đọc dữ liệu từ sáu thanh ghi mỗi chu kỳ và ghi dữ liệu vào 3 thanh ghi. Đó là rất nhiều, khủng khiếp rất nhiều kết nối rất nhanh.

Tất nhiên bạn chỉ có thể sử dụng nhiều bóng bán dẫn hơn. Vấn đề là: Tốc độ đi xuống. Bạn cần thêm phần cứng để chọn từ nhiều thanh ghi hơn. Không gian cho tệp đăng ký trở nên lớn hơn. Tất cả những điều đó làm cho mọi thứ chậm hơn. Vì vậy, với cùng một công nghệ, bạn có thể có 16 thanh ghi và chạy ở 2.600 MHz hoặc có 32 thanh ghi và chạy ở 2.400 MHz. Bây giờ các thanh ghi bổ sung phải bù cho tốc độ xung nhịp giảm đáng kể.


2

Yếu tố nào ảnh hưởng đến số lượng đăng ký

- Phân cấp bộ nhớ

Các thanh ghi, Cache, RAM đều được thực hiện với các công nghệ lưu trữ khác nhau.

Công nghệ khác nhau khác nhau trong

  1. Thời gian truy cập
  2. Giá cả
  3. Tỉ trọng

Một ví dụ: Các thanh ghi bên trong được tìm thấy trong CPU là Bộ nhớ truy cập ngẫu nhiên tĩnh , trong khi bộ nhớ chính của máy tính là Bộ nhớ truy cập ngẫu nhiên động

Một tế bào nhị phân RAM tĩnh được triển khai bằng cách sử dụng mạch 6 bóng bán dẫn trong khi một tế bào nhị phân RAM động được thực hiện bằng cách sử dụng tụ điện và bóng bán dẫn. So sánh SRAM và DRAM

  • Bộ nhớ SRAM nhanh hơn nhiều so với bộ nhớ DRAM [Vài chu kỳ để truy cập SRAM so với DRAM]
  • Mạch SRAM tiêu thụ ít năng lượng hơn DRAM
  • DRAM yêu cầu làm mới từng bit trong bộ nhớ theo định kỳ không giống như SRAM
  • SRAM có giá cao hơn DRAM
  • SRAM có mật độ thấp hơn so với DRAM

Vì vậy, nó không phải là một điều thiết thực để tăng số lượng bộ nhớ mật độ nhanh, đắt tiền, ít mật độ. Trong thực tế, chúng ta có thể sử dụng một vài trong số chúng và một chương trình được viết tốt sẽ lưu trữ dữ liệu được sử dụng thường xuyên nhất bên trong các thanh ghi nhanh này trong khi dữ liệu ít sử dụng hơn được lưu trữ trong bộ nhớ chậm hơn.

- Độ dài chỉ dẫn

Địa chỉ của các thanh ghi được bao gồm trong một lệnh, giới hạn số lượng các thanh ghi có thể truy cập dựa trên số bit có thể đại diện cho địa chỉ. Ví dụ, trong kiến ​​trúc MIPS, lệnh có độ dài 32 bit chỉ giữ 5 bit để biểu thị địa chỉ của các thanh ghi có thể truy cập, giới hạn số lượng thanh ghi là 2 5 = 32 thanh ghi. Việc tăng số lượng các thanh ghi sẽ yêu cầu tăng độ dài lệnh để bao gồm đủ các bit có thể truy cập vào tất cả các thanh ghi.


2

Nếu bạn có một cái nhìn về tập lệnh của bộ xử lý, có một số cách để nhóm chúng. Ví dụ: tất cả các ADDhướng dẫn có thể được nhóm lại với nhau và tất cả các XORhướng dẫn.

Trong mỗi nhóm của cùng một hướng dẫn, có thể có các phiên bản hoạt động trên bộ nhớ hoặc trên các thanh ghi. Chính nhóm phụ này xác định hiệu quả số lượng thanh ghi mà bộ xử lý có.

Như một ví dụ giả thuyết 8 bit, giả sử các $Axhướng dẫn có thể là ADDhướng dẫn và $Cxcó thể là XORhướng dẫn. Với thiết kế này, chỉ còn bốn bit để xác định toán hạng!

  • Một có thể chỉ có bốn thanh ghi mục đích chung và sử dụng hai bit để xác định một và hai bit để xác định thanh ghi kia.
  • Hoặc, người ta có thể sử dụng bit đầu tiên để phân biệt các biến thể "đặc biệt" và 3 bit còn lại để xác định tám thanh ghi nào hoạt động với bộ tích lũy ( $x0có thể là chính bộ tích lũy).
  • Hoặc, người ta có thể có nhiều hơn số lượng thanh ghi này - nhưng sau đó giới hạn các thanh ghi nào có thể truy cập được theo hướng dẫn nào.

Tất nhiên, chúng ta đã qua các tập lệnh 8 bit. Tuy nhiên, logic này đã giúp xác định các bộ đăng ký trong quá khứ - nó sẽ tiếp tục làm như vậy trong tương lai.

EDIT (theo yêu cầu)

Nói top bốn bit là dành cho các hướng dẫn: ADD, SUB, XOR, MOV, CMPvv Có 16 khả năng đây. Sau đó, đối với những hướng dẫn trong đó đăng ký để đăng ký có ý nghĩa (ví dụ ADD Rx,Ry), bạn cần chỉ định RxRy. Nói hai bit tiếp theo là cho x, và hai bit cuối cùng là cho y. Như vậy:

ADD R1, R2  =>  'ADD' + 'R1' + 'R2' => $A0 + $04 + $02

Chỉ với hai bit để xác định một thanh ghi như thế này, bạn chỉ có đủ chỗ cho tổng số bốn thanh ghi!

Bên cạnh, bạn sẽ lưu ý rằng một số kết hợp đăng ký không có ý nghĩa. Ví dụ: MOV Rx, Rx(không làm gì) và SUB Rx, Rx(luôn luôn tạo ra 0). Đây có thể trở thành hướng dẫn trường hợp đặc biệt:

  1. SUB Rx, Rxcó thể trở thành NOT Rx- một lệnh toán hạng đơn.
  2. MOV Rx, Rxcó thể trở thành một MOVlệnh lấy byte thứ hai làm giá trị ngay lập tức, được hiểu là MOV Rx, #$yy.

Theo cách này, bạn có thể "chơi" với bản đồ hướng dẫn, điền vào các lỗ cho các hướng dẫn vô dụng hoặc vô nghĩa để cung cấp một tập lệnh lớn hơn cho lập trình viên. Nhưng cuối cùng, tập lệnh sẽ định nghĩa tập đăng ký.


Tôi vẫn còn bối rối, bạn có thể giải thích làm thế nào chỉ còn lại 4 bit cho toán hạng?
Darshan Chaudhary

Kiểm tra câu trả lời được cập nhật của tôi
John Burger

1
IMHO câu trả lời này sẽ được cải thiện đáng kể bằng cách chuyển " ví dụ giả định giả định tập lệnh 8 bit " sang đầu câu hỏi. Tôi đã lãng phí thời gian để cố gắng hiểu ý nghĩa của nó, kết luận nó chỉ có ý nghĩa đối với một hướng dẫn có độ dài cố định 8 bit, sau đó đọc tiếp để thấy rằng đó là trường hợp. IMHO, loại tập lệnh đó không liên quan lắm trong ngữ cảnh của câu hỏi; toàn bộ không gian địa chỉ của nó có thể được kết hợp chặt chẽ RAM tĩnh. Tôi cũng nghĩ phần bắt đầu " Một số kết hợp đăng ký không có ý nghĩa ... " không liên quan đến câu hỏi và có thể bị xóa. 0,02 đô la của tôi
xe đạp

-2

Intel hiện đang sử dụng hàng ngàn thanh ghi - hàng trăm lõi CPU. Nhưng lượng dữ liệu lớn nhất được lưu trữ trên CPU nằm trong bộ đệm, điều này gián tiếp trả lời câu hỏi. Bộ nhớ cache được tổ chức theo lớp, với bộ đệm L1 nhanh nhỏ và bộ đệm L2 và L3 chậm hơn ở xa hơn. Tệp đăng ký theo nghĩa là L0, thậm chí nhanh hơn L1 nhưng thậm chí còn nhỏ hơn. Vì vậy, bạn có thể tăng số lượng đăng ký, nhưng điều đó có thể sẽ làm chậm chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.