2013-03-27 36 views
19

Tôi đã xem qua đoạn trích này ngày hôm nay:Tại sao hoạt động bitwise hơi nhanh hơn các phép toán cộng/trừ trên các bộ vi xử lý cũ?

Trên hầu hết các bộ vi xử lý cũ, hoạt động Bitwise là nhanh hơn một chút so với cộng và hoạt động trừ và nhanh hơn nhân và chia hoạt động thường đáng kể. Trên các kiến ​​trúc hiện đại, đây không phải là trường hợp: các hoạt động bitwise thường là tốc độ tương tự như bổ sung (mặc dù vẫn nhanh hơn phép nhân).

Tôi tò mò về lý do tại sao hoạt động bitwise nhanh hơn một chút so với hoạt động cộng/trừ trên bộ vi xử lý cũ hơn. Tất cả tôi có thể nghĩ rằng điều đó sẽ gây ra độ trễ là các mạch để thực hiện cộng/trừ phụ thuộc vào nhiều cấp độ cổng logic (bộ cộng song song và không có), trong khi các hoạt động bitwise có triển khai mạch đơn giản hơn rất nhiều. Đây có phải là lý do không?

Tôi biết số học và bitwise hoạt động cả hai thực hiện trong một đồng hồ-cyle trên bộ vi xử lý hiện đại, nhưng nói hoàn toàn về thời gian tuyên truyền cho mạch, là độ trễ vẫn lý thuyết có trong bộ vi xử lý hiện đại?

Cuối cùng, tôi đã có một C câu hỏi khái niệm về việc thực hiện các hoạt động Bitwise thay đổi:

unsigned x = 1; 
x <<= 5; 

unsigned y = 0; 
y += 32; 

Cả xy nên giữ giá trị 32, nhưng nó đã mất thay đổi riêng rẽ trái để có được x cho giá trị đó (như trong các thay đổi bitwise được thực hiện qua đường ống)? Để làm rõ, tôi hỏi hoàn toàn về hành vi mạch chứ không phải số chu kỳ đồng hồ.

+1

Ví dụ đầu tiên của bạn cho số không, nhưng đó có thể là lỗi đánh máy. Phần còn lại của câu hỏi của bạn là phần cứng cụ thể và có thể không có chủ đề ở đây. –

+0

@ 500 Tôi nghĩ rằng nó có liên quan để biết các hoạt động của một bộ xử lý để bạn có thể hiểu rõ hơn cách mã mức cao chạy. – kjprice

+0

@kjprice: Đủ công bằng - bạn sẽ nhận thấy rằng tôi không bỏ phiếu để đóng. –

Trả lời

21

Trong bất kỳ hoạt động bitwise nhị phân nào, mỗi bit đầu ra chỉ phụ thuộc vào hai bit tương ứng trong các đầu vào. Trong một hoạt động thêm, mỗi bit đầu ra phụ thuộc vào các bit tương ứng trong các đầu vào và tất cả các bit ở bên phải (đối với các giá trị thấp hơn).

Ví dụ, các bit tận cùng bên trái của 01.111.111 + 00000001 là 1, nhưng các bit tận cùng bên trái của 01.111.110 + 00000001 là 0.

Ở dạng đơn giản nhất, một bộ cộng thêm hai bit thấp và tạo ra một chút và đầu ra một carry. Sau đó, hai bit thấp nhất tiếp theo được thêm vào, và carry được thêm vào, tạo ra một bit đầu ra khác và một bit mang khác. Điều này lặp đi lặp lại. Vì vậy, bit đầu ra cao nhất là ở phần cuối của chuỗi thêm. Nếu bạn thực hiện thao tác từng chút một, như các bộ vi xử lý cũ hơn đã làm, thì sẽ mất thời gian để kết thúc.

Có nhiều cách để tăng tốc độ này lên một số, bằng cách nạp một số bit đầu vào vào các sắp xếp logic phức tạp hơn. Nhưng điều đó tất nhiên đòi hỏi nhiều diện tích hơn trong chip và nhiều quyền lực hơn.

Bộ xử lý của ngày nay có nhiều đơn vị khác nhau để thực hiện nhiều loại công việc khác nhau — tải, lưu trữ, bổ sung, nhân, hoạt động điểm động và hơn thế nữa.Với khả năng của ngày hôm nay, công việc thực hiện thêm là nhỏ so với các tác vụ khác, vì vậy nó phù hợp với một chu kỳ xử lý duy nhất.

Có lẽ về mặt lý thuyết, bạn có thể chế tạo bộ xử lý hoạt động bit nhanh hơn một lần thêm. (Và có, ít nhất là trên giấy, bộ vi xử lý kỳ lạ hoạt động không đồng bộ, với các đơn vị khác nhau làm việc ở các bước riêng của chúng.) Tuy nhiên, với các mẫu thiết kế đang sử dụng, bạn cần một số chu trình cố định thường xuyên để phối hợp nhiều thứ trong bộ xử lý hướng dẫn, gửi chúng đến các đơn vị thực hiện, gửi kết quả từ các đơn vị thực thi đến các thanh ghi, và nhiều, nhiều hơn thế nữa. Một số đơn vị thực thi yêu cầu nhiều chu kỳ để hoàn thành công việc của họ (ví dụ: một số đơn vị dấu chấm động mất khoảng bốn chu kỳ để thực hiện thêm dấu chấm động). Vì vậy, bạn có thể có một kết hợp. Tuy nhiên, với quy mô hiện tại, làm cho chu kỳ thời gian nhỏ hơn để nó phù hợp với một hoạt động bitwise nhưng không phải là một bổ sung có khả năng không kinh tế.

-1

Điều này tôi lóe sáng từ phần giới thiệu đến lớp lắp ráp. Nhưng chuyển dịch chỉ là về lệnh nhanh nhất mà một bộ xử lý có thể thực hiện. Việc cộng và trừ đòi hỏi một vài hướng dẫn để thực hiện. Tôi tưởng tượng rằng các bộ vi xử lý hiện đại được tối ưu hóa tốt hơn.

Có lẽ ai đó có thể trả lời câu hỏi này chính xác và kỹ lưỡng hơn.

0

Bit điều hành khôn ngoan thực hiện đúng thời hạn ít hơn, vì

  • xử lý mất một hướng dẫn để thực hiện thao tác chút khôn ngoan và (hãy nói) mất một chu kỳ thực hiện, mặt khác hướng dẫn số học khác (đặc biệt, nhân và chia) lấy chu kỳ thực hiện hơn
  • Hầu hết các hoạt động khôn ngoan thời gian bit được thực hiện với một đăng ký và hướng dẫn số học khác cần thiết để xử lý nhiều sau đó một thanh ghi

Đó là lý do tại sao các bit dịch chuyển nhanh hơn khi đó các phép toán số học khác là

3

Điều phức tạp về việc thêm (bạn thường bị trừ đi miễn phí) là có vấn đề mang tính pesky.

Vì vậy, bạn kết thúc với giải pháp ngây thơ là N lần Full-Adders trong đó N là ALU bao nhiêu bit.

Những thao tác này có nghĩa là bạn có rất nhiều thời gian trì hoãn. Và, bởi vì một lần mang đi có thể làm cho toàn bộ kết quả không chính xác, bạn sẽ phải đợi một khoảng thời gian khá lớn cho tất cả các giá trị mang và trong lượt, tất cả các bộ cộng đầy đủ khác trong chuỗi giải quyết.

Có rất nhiều cách xung quanh nút cổ chai cụ thể này, nhưng không có cách nào đơn giản hoặc rẻ tiền để thực hiện như một chuỗi các trình bổ sung đầy đủ. (Nhanh nhất là một bảng tra cứu thực hiện trong silicon)

Nếu bạn muốn biết thêm chi tiết, bạn sẽ có lẽ không cần phải hỏi này trên http://electronics.stackexchange.com thay

+0

Nếu bạn nghĩ về bảng tra cứu sẽ được triển khai như thế nào, với các bộ tách kênh chọn tín hiệu kết hợp với tín hiệu từ toán hạng khác, trong một trong 2^N cổng, sẽ đưa vào bộ ghép kênh một lần nữa, bạn sẽ nhận ra rằng hoàn toàn tổ hợp adder * là * chỉ là một bảng tra cứu, rất nhiều tối ưu hóa để thoát khỏi tất cả các logic trùng lặp. –

+0

@BerndJendrissek Tất cả mọi thứ đều có trong bảng tra cứu tại một số điểm. Xem thêm ["Nuke chiến thuật của thiết kế logic"] (http://www.6502.org/users/dieter/a1/a1_4.htm) – Earlz

0

Triển khai một số bổ sung phải làm một chu kỳ bổ sung cho các bit thực hiện. Ví dụ: số nguyên 16 bit yêu cầu nhiều hướng dẫn trên bộ xử lý 8 bit. Điều này cũng giữ cho sự thay đổi. Nhưng sự dịch chuyển luôn có thể dịch chuyển các bit chiều cao đến các bit thấp hơn của byte tiếp theo. Việc bổ sung phải thêm bit thấp hơn trong một vòng bổ sung.

1

Để trả lời câu hỏi cuối cùng của bạn, điều đó tùy thuộc. Một số kiến ​​trúc chỉ có thay đổi 1 (như z80), một số kiến ​​trúc cho thấy sự thay đổi bởi hằng số lớn hơn và/hoặc biến nhưng thực hiện chúng trong nội bộ dưới dạng một "thay đổi 1" (chẳng hạn như triển khai cũ x86), có một số kiến ​​trúc có thể thay đổi nhiều hơn 1 trong một chu kỳ nhưng chỉ khi số lượng thay đổi là hằng số, có một số kiến ​​trúc (như triển khai hiện đại x86) sử dụng barrel shifter và có thể thay đổi theo một biến chu kỳ, và vẫn còn nhiều khả năng hơn.

Độ sâu mạch của bộ chuyển đổi thùng là logarit trong sự thay đổi tối đa mà nó có thể thực hiện, không nhất thiết là chiều rộng của thanh ghi - đôi khi nhỏ hơn chiều rộng và có thể cho rằng nó ít hơn.