Làm thế nào để hướng dẫn Thumb so với hướng dẫn ARM cho hiệu suất?


11

Một đồng nghiệp đã đề cập rằng các hướng dẫn Thumb chậm hơn đáng kể so với các hướng dẫn của ARM (đây là cho bộ xử lý AT91SAM7S32). Điều này có đúng không? Những lợi ích hiệu suất của một hướng dẫn được đặt trên một hướng dẫn khác là gì?

Câu trả lời:


11

Nói chung

Hướng dẫn THUMB về bản chất không chậm hơn so với hướng dẫn của ARM, nhưng hạn chế hơn về khả năng. Nếu mã của bạn chỉ cần chức năng của các hướng dẫn THUMB, nó sẽ chiếm ít không gian hơn ARM, nhưng sẽ có cùng số lượng hướng dẫn và, những thứ khác đều bằng nhau, chạy ở cùng tốc độ. Nếu mã của bạn cần nhiều chức năng hơn, nó sẽ yêu cầu nhiều lệnh THUMB hơn các lệnh ARM để thực thi và sẽ mất nhiều thời gian hơn, một lần nữa những thứ khác lại bằng nhau (xem bên dưới)

THUMB phổ biến trong các bộ vi điều khiển vì các hướng dẫn kích thước nhỏ hơn vì hai lý do:

  1. Không gian chương trình thường bị giới hạn
  2. Nhiều bộ vi điều khiển có các bus dữ liệu 16 bit đến flash bên trong của chúng

Vì lý do thứ hai, khi mã của bạn không yêu cầu chức năng từ tập lệnh ARM, mã THUMB thực sự chạy nhanh hơn. Điều này là do hướng dẫn của bạn có thể được tìm nạp trong một chu kỳ I / O từ đèn flash thay vì hai. Tùy thuộc vào tốc độ của giao diện flash của bạn, lần đọc thứ hai đó có thể phải chịu một hoặc nhiều chu kỳ chờ cho mỗi lệnh trong đó CPU của bạn bị ngưng trệ và không thể làm gì.

Điều này trở thành ít vấn đề hơn nếu bạn có thể sao chép mã của mình vào RAM trước khi thực thi (điều mà tôi thường thấy là 32 bit cho các bộ vi điều khiển ARM gần đây), trong đó mối quan tâm duy nhất là mật độ mã. Do đó, nhiều công cụ sẽ cố gắng tìm đại diện nào hiệu quả hơn cho một chức năng nhất định. Nếu trình biên dịch có thể tạo mã THUMB theo ít hướng dẫn hơn, nhưng nếu ARM dẫn đến ít hướng dẫn hơn, bạn sẽ nhận được ARM. Đây là chế độ mặc định cho Keil, nếu tôi nhớ chính xác.

Con chip cụ thể của bạn

Đối với chip cụ thể của bạn (AT91SAM7S32), tài liệu đề cập rằng bộ điều khiển flash có bộ đệm tìm nạp có thể dự đoán các truy cập để làm cho mọi thứ hiệu quả hơn, có thể cải thiện việc thực hiện lệnh ARM. Tuy nhiên, nó cũng nói rằng prefetch là bộ đệm "32 bit kép" "tối ưu hóa truy cập 16 bit", phù hợp nhất cho "chạy ở chế độ Thumb", dường như cho thấy rằng nó không có ý định tăng tốc Hướng dẫn ARM, nhưng để cho phép lõi của bạn chạy nhanh hơn trong chế độ THUMB.

Từ các sơ đồ, có vẻ như đèn flash trên chip của bạn thực sự có bus dữ liệu 32 bit. Trình tải trước dường như hoạt động bằng cách đọc toàn bộ 32 bit, cung cấp 16 cho CPU (ở chế độ THUMB) và lưu trữ toàn bộ 32 bit. Trong chu kỳ tiếp theo, khi CPU đọc 16 bit thứ hai, lần này là từ bộ đệm, bộ điều khiển flash đang đọc 32 bit tiếp theo và lưu vào bộ đệm. Theo cách này, mã THUMB có thể chạy mà không cần chờ đợi ban đầu ngay cả khi tốc độ flash sẽ chậm hơn một chút so với tốc độ lõi CPU. Mục 19.2.2 "Hoạt động đọc" có nhiều chi tiết hơn.

Vì đèn flash của bạn là bus 32 bit (gần như tôi có thể biết), nếu đồng hồ CPU và Flash của bạn giống nhau, THUMB sẽ chỉ cung cấp cho bạn mật độ mã trên ARM. Nếu bạn muốn lõi CPU của bạn chạy nhanh hơn Flash (và lưu ý, tôi đã không xem lại tất cả thời gian của chip này; tôi cho rằng CPU có thể chạy nhanh hơn vì chúng cho phép bạn đặt trạng thái chờ), hơn là việc tìm nạp trước cho tốc độ lợi thế cho THUMB do giảm truy cập flash thực tế. Tuy nhiên, lợi thế tốc độ đó là lợi thế theo hướng dẫn. Nếu số lượng hướng dẫn THUMB so với hướng dẫn ARM đủ lớn, nó sẽ vượt xa tốc độ trên mỗi hướng dẫn dẫn đến ARM có tốc độ trên mỗi thói quen nhanh hơn.

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.