2010-09-16 45 views
8

Tôi muốn biết nếu thực hiện một sự thay đổi đúng hợp lý là nhanh hơn khi chuyển bằng một sức mạnh của 2. Tôi đang sử dụng C + +.Là sự dịch chuyển hợp lý bằng sức mạnh của 2 nhanh hơn?

Ví dụ, là

myUnsigned >> 4 

nhanh hơn bất kỳ

myUnsigned >> 3 

tôi đánh giá cao phản ứng đầu tiên của mọi người sẽ nói với tôi rằng người ta không nên lo lắng những điều nhỏ nhặt về nhỏ như thế này, đó là sử dụng các thuật toán và bộ sưu tập chính xác để cắt các đơn đặt hàng có độ lớn quan trọng. Tôi hoàn toàn đồng ý với bạn, nhưng tôi thực sự cố gắng để ép tất cả tôi có thể ra khỏi một chip nhúng (một ATMega328) - Tôi chỉ có một sự thay đổi hiệu suất xứng đáng với một 'woohoo!' bằng cách thay thế một phân chia với một chút thay đổi, vì vậy tôi hứa với bạn rằng điều này không quan trọng.

Cảm ơn bạn.

+8

Tại sao bạn không tự đo mình? –

+7

Ai quan tâm nếu 'x >> 4' nhanh hơn' x >> 3'? Họ có ngữ nghĩa khác nhau, vì vậy nó không quan trọng cái nào là nhanh hơn. Dù sao, tôi chưa bao giờ gặp phải một kiến ​​trúc mà toán hạng bên phải của một toán tử thay đổi bit có bất kỳ tác động hiệu suất nào. – fredoverflow

+4

@FredOverflow: Trên ATMega, lệnh bit-shift không thực hiện một "số bit để dịch chuyển" toán hạng. Về 'x >> 4' so với' x >> 3' - có lẽ OP có một số tự do ở đây (ví dụ như làm số học điểm cố định và có một số lượng vĩ độ nhất định trong thành phần phân số là bao nhiêu) –

Trả lời

17

Hãy nhìn vào bảng dữ liệu:

http://atmel.com/dyn/resources/prod_documents/8271S.pdf

Theo như tôi thấy, ASR (shift số học phải) luôn chuyển bởi một chút và không thể lấy số bit để chuyển; phải mất một chu kỳ để thực thi. Do đó, dịch chuyển phải bằng n bit sẽ lấy n chu kỳ. Quyền hạn của hai hành xử chỉ giống như bất kỳ số nào khác.

+0

Cảm ơn bạn! Tôi đã phải thay thế một số dấu chấm động bằng một số nguyên, nhưng điều này đã được nhân lên lớn hơn để giữ độ chính xác. Tôi đang cố gắng tìm một hệ số lý tưởng để tôi dành ít thời gian nhất có thể để thu nhỏ lại int xuống kích thước không được phép. – Will

1

Nếu bộ xử lý của bạn có hướng dẫn bit shift (rất có thể), thì nó phụ thuộc vào việc triển khai phần cứng của lệnh đó nếu có sự khác biệt giữa chuyển bit nguồn hoặc 2 bit một số khác. Tuy nhiên, nó không có khả năng tạo nên sự khác biệt.

4

Bạn phải tham khảo tài liệu về bộ xử lý của mình để biết thông tin này. Ngay cả đối với một tập lệnh nhất định, có thể có các chi phí khác nhau tùy thuộc vào kiểu máy. Trên một bộ vi xử lý thực sự nhỏ, việc dịch chuyển bởi một người có thể nhanh hơn so với các giá trị khác, ví dụ như trường hợp hướng dẫn xoay trên một số bộ xử lý IA32, nhưng đó chỉ là vì lệnh này hiếm khi được trình biên dịch tạo ra).

Theo http://atmel.com/dyn/resources/prod_documents/8271S.pdf tất cả các thay đổi hợp lý được thực hiện trong một chu kỳ cho ATMega328. Nhưng tất nhiên, như đã chỉ ra trong các ý kiến, tất cả các thay đổi hợp lý là một chút. Vì vậy, chi phí dịch chuyển theo số nn chu kỳ trong n hướng dẫn.

+0

Hãy coi chừng: Hướng dẫn thay đổi luôn thay đổi chỉ một chút ... để bạn tiếp tục thay đổi, mất nhiều thời gian hơn. –

+1

+1 để điều tra CPU cụ thể. –

+0

@Martin B Cảm ơn bạn đã chỉ ra, tôi nên chú ý đến nó, thông tin đã có sẵn trong cùng một tệp PDF. –

0

Với tất cả sự tôn trọng, bạn thậm chí không nên bắt đầu nói về performace cho đến khi bạn bắt đầu đo. Biên dịch chương trình với bộ phận. Chạy. Đo thời gian. Lặp lại với ca.

+1

Cho rằng anh ta đã đo được sự cải thiện hiệu suất bằng cách thay thế div bằng ca làm việc, tôi nghĩ rõ ràng là anh ấy đang chạy thời gian. – Crashworks

+0

AFAIK nó là một vấn đề được biết đến rộng rãi về tính toán máy tính mà thay đổi OPs nhanh hơn nhiều so với phép nhân, phép chia chậm hơn phép nhân (chúng chậm hơn ngay cả trên giấy)). Phép cộng/trừ gần như nhanh chóng thay đổi - chỉ trong lý thuyết chúng sử dụng nhiều bóng bán dẫn hơn một chút, nhưng nó không quan trọng và CPU thực hiện chúng trong một chu kỳ đơn lẻ. nhân và phân chia mất nhiều chu kỳ – Mixaz

+0

phép nhân và phân chia mất nhiều chu kỳ hơn, vì chúng sử dụng phép cộng/trừ trong các lần lặp tiếp theo. Tôi nhớ lại rằng thông số kỹ thuật ARM (ít nhất là cho các phiên bản cũ) nói rằng phân chia (tôi không nhớ về phép nhân) có thể mất thời gian khác nhau, vì rằng – Mixaz

4

Trong AVR instruction set, phép dịch số học phải và trái xảy ra một chút tại một thời điểm. Vì vậy, đối với vi điều khiển đặc biệt này, dịch chuyển >> n có nghĩa là trình biên dịch thực sự tạo ra nhiều cá nhân asr ops, và tôi đoán >>3 là nhanh hơn >>4.

Điều này làm cho AVR khá bất thường, bằng cách này.

+0

nó không phải bất thường. Hầu hết (nếu không phải tất cả) vi điều khiển 8 bit không có bộ phận đóng thùng và phải dịch một bit tại một thời điểm –

2

Tùy thuộc vào cách bộ vi xử lý được tạo. Nếu bộ xử lý có vòng xoay thùng, nó có thể dịch chuyển số bit bất kỳ trong một thao tác, nhưng điều đó chiếm không gian chip và ngân sách điện. Phần cứng kinh tế nhất sẽ chỉ có thể xoay một phần, với các tùy chọn liên quan đến bit xung quanh. Tiếp theo sẽ là một trong đó có thể xoay một trong hai bên trái hoặc phải. Tôi có thể tưởng tượng ra một cấu trúc có thể có 1-shifter, 2-shifter, 4-shifter, v.v.trong trường hợp này 4 có thể nhanh hơn 3.

1

Tháo rời trước rồi đặt mã. Không được nản chí bởi những người nói với bạn, bạn đang lãng phí thời gian của bạn. Những kiến ​​thức bạn đạt được sẽ đưa bạn vào vị trí làm người goto để dập tắt đám cháy của công ty lớn. Số lượng người có thực sự đằng sau kiến ​​thức bức màn đang giảm ở một tỷ lệ đáng báo động trong ngành công nghiệp này.

Âm thanh như những người khác giải thích câu trả lời thực sự ở đây, việc tháo gỡ nào sẽ hiển thị, hướng dẫn thay đổi bit đơn. Vì vậy, 4 ca sẽ mất 133% thời gian 3 ca được thực hiện, hoặc 3 ca là 75% thời gian của 4 ca tùy thuộc vào cách bạn so sánh các con số. Và các phép đo của bạn nên phản ánh sự khác biệt đó, nếu họ không tiếp tục thử nghiệm này cho đến khi bạn hoàn toàn hiểu được thời gian thực hiện.

0

trên thực tế, ATMega có lệnh chuyển hướng nibble. Vì vậy, chuyển x << 4 có thể nhanh hơn x << 3

x << 3 được thực hiện bởi 3 trái thay đổi

x <<= 1; 
x <<= 1; 
x <<= 1; 

trong khi x << 4 chỉ cần một hoán đổi và một chút rõ ràng

swap(x); // swap the top and bottom nibble AB <-> BA 
x &= 0xf0; 

hoặc

x &= 0x0f; 
swap(x); 

hoặc nếu bạn có thể hãy chắc chắn rằng 4 bit trên cùng là số không thì chỉ cần hoán đổi nibble là đủ

swap(x); 
+0

Hm, tôi không biết rằng x << 3 trong AVR được thực hiện dưới dạng 3 ca. Bạn có chắc chắn rằng AVR có một OP đặc biệt cho một sự thay đổi bit? Trên hoán đổi ARM và << 3 sẽ mất cùng một thời gian (1 chu kỳ) – Mixaz

+1

@Mixaz không có vi điều khiển 8 bit Tôi biết có bộ phận đóng thùng, vì vậy nó chỉ có thể dịch chuyển 1 bit mỗi chu kỳ. Chỉ cần tìm tập lệnh AVR, PIC hoặc 8051 và xem –

+0

Ngay cả một số vi điều khiển 16 bit vẫn phải dịch 1 bit mỗi lần. Tập lệnh ARV được đăng trong các câu trả lời khác, đọc nó trước –

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