2013-04-06 44 views
6

Tôi đang làm việc trên bộ điều khiển ARM Cortex-M3 có bộ chỉ dẫn Thumb-2.Hiệu suất ARM Thumb/Thumb-2

Chế độ ngón tay cái được sử dụng để nén hướng dẫn thành kích thước 16 bit. Vì vậy, kích thước mã được giảm. Nhưng với chế độ Thumb bình thường, tại sao nó nói rằng hiệu năng được giảm? hiệu suất

Trong trường hợp của Thumb-2, người ta nói được cải thiện theo hai liên kết sau đây:

Cải thiện hiệu suất trong trường hợp một đơn 16 -bit hướng dẫn hạn chế các chức năng có sẵn cho trình biên dịch.

Mục đích đã nêu cho Thumb-2 là đạt được mật độ mã tương tự như Thumb với hiệu suất tương tự như hướng dẫn ARM được đặt trên bộ nhớ 32 bit.

Hiệu suất này chính xác như thế nào? Ai đó có thể đưa ra một vài ví dụ liên quan đến nó?

+1

Hiệu suất luôn tương đối. Có nhiều trường hợp mã 'thumb' chạy tốt hơn' arm'. Chủ yếu là nếu xe buýt bộ nhớ là một cổ chai. Nói chung, 'thumb' không có nhiều thanh ghi, vì vậy mặc dù tập lệnh nhỏ gọn hơn, với một số thuật toán, nó sẽ phải truy cập bộ nhớ thường xuyên hơn để làm tràn các thanh ghi. –

+1

Nếu tôi có một chiếc xe tải giao hàng A và một chiếc xe tải B có kích thước bằng một nửa A. Nếu số lượng đồ được giao trong xe tải A nhưng lớn hơn đối với xe tải B thì sẽ mất gấp đôi xe tải B gấp đôi cùng một công việc. Ngón tay cái không phải là một nửa hiệu quả như ARM, nó giống như 10-15% hướng dẫn nhiều hơn để làm điều tương tự như ARM. –

+0

Xem thêm: [Gcc -mthumb vs -marm] của Stackoverflow (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) và [giấy Arizona] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) trên Thumb và ARM biên dịch có hướng dẫn. –

Trả lời

6

Khi so sánh với bộ lệnh ARM 32 bit, bộ chỉ dẫn 16 bit (không nói về phần mở rộng thumb2) mất ít dung lượng hơn vì hướng dẫn bằng một nửa kích thước, nhưng có hiệu suất giảm, nói chung, bởi vì nó cần thêm hướng dẫn để làm điều tương tự như trên cánh tay. Có ít tính năng hơn trong tập lệnh và hầu hết các lệnh chỉ hoạt động trên thanh ghi r0-r7. Táo để Táo so sánh hướng dẫn nhiều hơn để làm điều tương tự là chậm hơn.

Giờ đây, tiện ích mở rộng thumb2 sử dụng các hướng dẫn ngón tay cái chưa được xác định trước đây và tạo hướng dẫn bằng ngón tay cái 32 bit. Hiểu rằng có nhiều hơn một bộ mở rộng thumb2. ARMv6m có thể thêm vài chục. ARMv7m thêm một cái gì đó giống như 150 hướng dẫn để các thiết lập hướng dẫn ngón tay cái, tôi không biết những gì ARMv8 hoặc giữ trong tương lai. Vì vậy, giả sử ARMv7m, họ đã thu hẹp khoảng cách giữa những gì bạn có thể làm trong ngón tay cái và những gì bạn có thể làm trong ARM. Vì vậy, thumb2 là một tập lệnh ARM bị giảm như ngón tay cái, nhưng không phải là giảm. Vì vậy, nó vẫn có thể có thêm hướng dẫn để làm điều tương tự trong thumb2 (giả sử cộng với ngón tay cái) so với ARM làm điều tương tự.

Điều này mang lại một hương vị của vấn đề, một hướng dẫn duy nhất trong cánh tay và ngón tay cái tương đương của nó.

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

Bây giờ trình biên dịch sẽ không làm điều đó, trình biên dịch sẽ biết là nhắm mục tiêu ngón tay cái và làm việc khác bằng cách chọn các thanh ghi khác. Bạn vẫn phải đăng ký ít hơn và tính năng ít hơn theo hướng dẫn:

mov r0,r1 
and r0,r2 

Tuy nhiên có hai hướng dẫn/chu kỳ thực hiện để và hai thanh ghi lại với nhau, mà không sửa đổi các toán hạng, và đặt kết quả trong một thanh ghi thứ ba. Thumb2 có ba thanh ghi và vì vậy bạn quay trở lại một lệnh đơn bằng cách sử dụng phần mở rộng thumb2. Và lệnh thumb2 đó cho phép r0-r15 trên bất kỳ ba thanh ghi nào trong đó ngón tay cái bị giới hạn ở r0-r7.

Xem sách hướng dẫn tham khảo kiến ​​trúc ARMv5, dưới mỗi hướng dẫn bằng ngón tay cái nó cho bạn thấy lệnh ARM tương đương. Sau đó đi đến lệnh ARM đó và so sánh những gì bạn có thể làm với lệnh hướng dẫn mà bạn không thể làm với lệnh thumb. Đó là một con đường một chiều các hướng dẫn ngón tay cái (không thumb2) có một mối quan hệ 1-1 với một lệnh ARM.tất cả các hướng dẫn ngón tay cái có hướng dẫn cánh tay tương đương. nhưng không phải tất cả các hướng dẫn cánh tay đều có chỉ dẫn ngón tay cái tương đương. Bạn sẽ có thể thấy từ bài tập này giới hạn trên các trình biên dịch khi sử dụng bộ chỉ dẫn ngón tay cái. Sau đó lấy ARMv7m Architectural Reference Manual và xem bộ hướng dẫn, và so sánh các mã hóa "tất cả các biến thể ngón tay cái" (những cái bao gồm ARMv4T) và những cái được giới hạn trong ARMv6 và/hoặc v7 và xem việc mở rộng các tính năng giữa ngón tay cái và thumb2 cũng như chỉ dẫn thumb2 không có đối tác ngón tay cái. Điều này sẽ làm rõ những gì các trình biên dịch phải làm việc giữa ngón tay cái và thumb2. Sau đó bạn có thể đi xa đến mức so sánh thumb + thumb2 với hướng dẫn ARM đầy đủ (ARMv7 AR là nó được gọi là gì?). Và thấy rằng thumb2 gần gũi hơn với ARM, nhưng bạn mất ví dụ điều kiện trên mọi lệnh, vì vậy thực thi điều kiện trong ngón tay cái trở nên so sánh với phân nhánh trên mã, trong ARM bạn đôi khi có thể có if-then-else mà không phân nhánh ..

+0

cũng rất cẩn thận, cortex-m3 và cortex-m4 là ARMv7m, cortex-m0 và -m1 là ARMv6m, có rất nhiều sự khác biệt giữa phần mở rộng thumb2 trên các bộ lệnh đó, cũng các trình biên dịch lept forward với cortex-m3 và thêm một loạt các công cụ thumb2, và bạn không thể sử dụng thumb2 trên vỏ não-m0 khi nó xuất hiện. Không chắc chắn nếu các trình biên dịch (gcc/clang) đã bắt kịp chưa hoàn toàn. Tương tự như vậy, cortex-m4 có (có thể có) dấu phẩy động làm giảm mùi vị của Cortex-A, và các trình biên dịch đã phải vật lộn với điểm nổi trên vỏ não-m4 khi nó xuất hiện. không chắc chắn nếu họ đã bắt kịp –

+0

nếu ngón tay cái có thể truy cập chỉ đăng ký R0-R7 ... thì làm thế nào trong ví dụ của bạn bạn đang sử dụng lệnh mov trên đăng ký r8, r9 & r10 ... xin đề nghị? – Katoch

+0

* Hướng dẫn MOST * ngón tay cái một vài có thể đặc biệt là một động thái cụ thể cao đến/từ mức thấp –

6

Thumb-2 giới thiệu hướng dẫn độ dài thay đổi cho Thumb gốc; bây giờ hướng dẫn có thể là một hỗn hợp của 16-bit và 32-bit. Điều đó có nghĩa là bạn giữ lại lợi thế về kích thước của Thumb ban đầu trong mã hàng ngày, nhưng bây giờ có quyền truy cập gần như toàn bộ tính năng ARM trong mã phức tạp hơn, nhưng không có chi phí ARM-interworking trước đó do Thumb tạo ra.

Ngoài việc truy cập nói trên vào bộ đăng ký đầy đủ từ tất cả các thao tác đăng ký, Thumb-2 thêm trở lại thực thi điều kiện không nhánh trong biểu mẫu khối IF-THEN (IT). Thumb gốc đã loại bỏ tính năng ARM thương hiệu của việc thực thi có điều kiện trên hầu hết các hướng dẫn; điều này đã đạt được trong Thumb-2 bằng cách thêm vào hướng dẫn CNTT với các điều kiện cho tối đa bốn hướng dẫn thành công.

Ngoài ra, tập lệnh đã tự mở rộng; ví dụ, Cortex-M4F thực hiện phần mở rộng DSP cũng như phần mở rộng dấu chấm động FPv4-SP. Trong thực tế, tôi tin rằng ngay cả NEON có thể được mã hóa trong Thumb2.