2012-09-10 30 views
11

Mức độ phổ biến là rep movsb chậm hơn nhiều so với rep movsd (hoặc trên 64 bit, rep movsq) khi thực hiện các thao tác giống hệt nhau. Tuy nhiên, tôi đã thử nghiệm trên một vài máy móc hiện đại, và thời gian chạy được phát ra giống nhau (lên đến tiếng ồn đo lường) trên một phạm vi rộng lớn các kích thước bộ đệm (10 byte đến 2 megs). Cho đến nay tôi vừa thử nghiệm trên 2 máy (Intel Atom D510 32 bit và AMD FX 8120 64 bit).Thông tin đáng tin cậy về hiệu suất lệnh x86 chuỗi?

  • Có bất kỳ x86 hiện đại (32 hoặc 64-bit) máy nơi rep movsb là chậm hơn so với rep movsd (hoặc rep movsq)?

  • Nếu không, máy cuối cùng có sự khác biệt là gì, và mức độ quan trọng của nó là bao nhiêu?

Tôi hỏi câu hỏi này từ một góc độ muốn tránh hàng-culting một loạt các xét nghiệm để phá vỡ bộ nhớ lên unaligned đầu/đuôi và trung liên kết vì lợi ích của việc sử dụng rep movsd hoặc rep movsq nếu không có lợi ích thực tế để làm điều này ...

+0

Kết quả hiệu suất của bạn cho các máy hiện đại là chính xác. –

+1

Nó được điều chỉnh bởi băng thông bus bộ nhớ, chứ không phải CPU. –

+0

Về lý thuyết có thể đúng, nhưng các cách sao chép khác (ví dụ: vòng lặp C) chậm hơn 2-8x. Vì vậy, thời gian cpu dành cho việc tạo ra sự khác biệt. –

Trả lời

15

Rất nhiều tiêu chuẩn ở đây: instlatx64.atw.hu

Ví dụ (Intel Core 2 Duo E6700):

REP MOVSB BW in L1D:13.04 B/c 34829MiB/s 
REP MOVSW BW in L1D:13.29 B/c 35493MiB/s 
REP MOVSD BW in L1D:13.40 B/c 35783MiB/s 

Điều này cho thấy rằng có sự khác biệt, nhưng nó rất nhỏ.

này một cho SandyBridge là một chút kỳ lạ:

REP MOVSB BW in L1D:25.50 B/c 86986MiB/s 
REP MOVSW BW in L1D:18.09 B/c 61721MiB/s 
REP MOVSD BW in L1D:27.47 B/c 93693MiB/s 

Có vẻ có một sự khác biệt lớn về số nguyên tử (dường như đã biến mất với D5xx, vì vậy bạn chỉ bỏ lỡ nó):

REP MOVSB BW in L1D: 0.53 B/c 990MiB/s 
REP MOVSW BW in L1D: 1.93 B/c 3598MiB/s 
REP MOVSD BW in L1D: 3.74 B/c 6960MiB/s 

Tôi đã không tìm thấy sự khác biệt lớn như vậy trên bất cứ điều gì khác có thể được coi là mới.

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