Độ trễ của hướng dẫn CPU trên bộ xử lý x86 và x64


13

Tôi đang tìm kiếm một số bảng hoặc một cái gì đó tương tự có thể giúp tôi tính toán hiệu quả của mã lắp ráp.

Như tôi biết việc dịch chuyển bit mất 1 xung nhịp CPU, nhưng tôi thực sự tìm kiếm thêm bao nhiêu (phép trừ sẽ giống nhau), phép nhân và cách tính thời gian phân chia nếu tôi biết các giá trị đang chia.

Tôi thực sự cần thông tin về các giá trị số nguyên, nhưng thời gian thực hiện float cũng được chào đón.


Câu trả lời:


9

Nói chung, mỗi thao tác này cũng cần một chu kỳ xung nhịp duy nhất để thực thi nếu các đối số nằm trong các thanh ghi ở các giai đoạn khác nhau của đường ống.

Bạn có ý nghĩa gì bởi độ trễ? Có bao nhiêu chu kỳ một hoạt động chi tiêu trong ALU?

Bạn có thể thấy bảng này hữu ích: http://www.agner.org/optizes/in cản_tables.pdf

Vì các bộ xử lý hiện đại là siêu vô hướng và có thể thực hiện không theo thứ tự, bạn thường có thể nhận được tổng số lệnh trên mỗi chu kỳ vượt quá 1. Các đối số cho lệnh macro là quan trọng nhất, nhưng thao tác cũng có vấn đề vì việc phân chia mất nhiều thời gian hơn XOR (<1 độ trễ chu kỳ).

Nhiều hướng dẫn x86 có thể mất nhiều chu kỳ để hoàn thành một số giai đoạn nếu chúng phức tạp (ví dụ lệnh REP hoặc tệ hơn là MWAIT).


3
Nhân số nguyên có độ trễ ít nhất 3c trên tất cả các CPU x86 gần đây (và cao hơn trên một số CPU cũ hơn). Trên nhiều CPU, nó được sắp xếp đầy đủ, do đó, thông lượng là 1 trên mỗi đồng hồ, nhưng bạn chỉ có thể đạt được điều đó nếu bạn có ba bội số độc lập trong chuyến bay. (Nhân bội của FP trên Haswell là độ trễ 5c, thông lượng 0,5c, do đó bạn cần 10 chuyến bay để thông lượng bão hòa). Division ( dividiv) thậm chí còn tồi tệ hơn: nó microcoded, và nhiều độ trễ cao hơn addhoặc shr, và thậm chí không pipelined đầy đủ trên bất kỳ CPU. Tất cả điều này là trực tiếp từ các bảng hướng dẫn của Agner Fog, vì vậy đó là một điều tốt mà bạn đã liên kết đó.
Peter Cordes


7

Tính toán hiệu quả của mã lắp ráp không phải là cách tốt nhất để thực hiện trong những ngày này của các đường ống Siêu thực hiện ngoài trật tự. Nó sẽ thay đổi theo loại bộ xử lý. Nó sẽ thay đổi theo hướng dẫn cả trước và sau (bạn có thể thêm mã bổ sung và đôi khi nó chạy nhanh hơn!). Một số hoạt động (phân chia đáng chú ý) có thể có một phạm vi thời gian thực hiện ngay cả trên các chip cũ dễ dự đoán hơn. Trên thực tế thời gian của rất nhiều lần lặp là cách duy nhất để đi.


Tôi biết điều đó, nhưng tôi cần điều đó không phải trong dự án thực tế mà là một dự án lập trình thú vị .
ST3

Cho dù bạn cần nó thực sự hay cho vui, không thay đổi câu trả lời cho dòng vi xử lý này. Thay vào đó, bạn đã xem xét chuyển sang một bộ xử lý xác định hơn, chẳng hạn như chip Propeller chưa?
Brian Knoblauch

3
Ngay cả với một vô hướng, các dự đoán sai của nhánh thực hiện theo thứ tự và các lỗi bộ nhớ cache có thể gây ra sự thay đổi trong thời gian chạy.
Paul A. Clayton

Đối với những thứ hoàn toàn bị ràng buộc bởi CPU (không bỏ sót bộ nhớ cache, không có sai sót chi nhánh), hành vi của CPU được hiểu đủ chi tiết để phân tích tĩnh thường có thể dự đoán gần như chính xác có bao nhiêu chu kỳ trên một vòng lặp trên một CPU cụ thể (ví dụ Intel Haswell). ví dụ: xem câu trả lời SO này khi nhìn vào asm do trình biên dịch tạo ra, hãy để tôi giải thích lý do tại sao phiên bản nhánh chạy nhanh hơn gần 1,5 lần so với phiên bản CMOV trên CPU Sandybridge của OP, nhưng gần hơn với Skylake của tôi.
Peter Cordes

Nếu bạn đang viết bằng tay vì lý do hiệu suất, thì thực sự hữu ích khi tìm kiếm các tắc nghẽn về độ trễ và thông lượng trên CPU Intel và AMD. Mặc dù vậy, điều đó thật khó và đôi khi những gì tối ưu cho AMD không phải là tối ưu cho Intel.
Peter Cordes

4

Bạn có thể tìm thấy thông tin về intel cpu tại hướng dẫn dành cho nhà phát triển phần mềm intel . Chẳng hạn, độ trễ là 1 chu kỳ cho phép cộng số nguyên và 3 chu kỳ cho phép nhân số nguyên.

Tôi không biết về phép nhân, nhưng tôi hy vọng phép cộng luôn luôn thực hiện một chu kỳ.


Một chu kỳ, ngoại trừ khi nó "miễn phí" (song song khi các đường ống xếp hàng chính xác) hoặc mất nhiều thời gian hơn do lỗi bộ nhớ cache. :-)
Brian Knoblauch

2
Hiện tại (2018) thông tin này có sẵn trong Phụ lục C có tên "Độ trễ hướng dẫn và thông lượng" của tài liệu 248966 "Hướng dẫn tham khảo tối ưu hóa kiến ​​trúc Intel® 64 và IA-32" cũng có sẵn trên trang được liên kết trong câu trả lời
stefanct
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.