เพื่อนร่วมงานกล่าวว่าคำสั่ง Thumb นั้นช้ากว่าคำสั่ง ARM อย่างมาก (สำหรับโปรเซสเซอร์ AT91SAM7S32) มันเป็นเรื่องจริงเหรอ? ประโยชน์ด้านประสิทธิภาพของคำแนะนำอย่างใดอย่างหนึ่งตั้งอยู่เหนือคำสั่งอื่น?
เพื่อนร่วมงานกล่าวว่าคำสั่ง Thumb นั้นช้ากว่าคำสั่ง ARM อย่างมาก (สำหรับโปรเซสเซอร์ AT91SAM7S32) มันเป็นเรื่องจริงเหรอ? ประโยชน์ด้านประสิทธิภาพของคำแนะนำอย่างใดอย่างหนึ่งตั้งอยู่เหนือคำสั่งอื่น?
คำตอบ:
คำแนะนำของ THUMB ไม่ใช่เพื่อความรู้ของฉันช้ากว่าคำแนะนำ ARM แต่ค่อนข้างมีขีด จำกัด ในความสามารถ หากรหัสของคุณต้องการฟังก์ชันการทำงานของคำสั่ง THUMB รหัสนั้นจะใช้พื้นที่น้อยกว่า ARM แต่จะเป็นจำนวนคำสั่งเท่ากันและสิ่งอื่น ๆ ที่เท่ากันจะทำงานด้วยความเร็วเดียวกัน หากรหัสของคุณต้องการฟังก์ชั่นมากกว่านั้นจะต้องใช้คำสั่ง THUMB มากกว่าคำสั่ง ARM ในการดำเนินการและใช้เวลานานกว่านั้นสิ่งอื่น ๆ ที่เท่าเทียมกัน (ดูด้านล่าง)
THUMB เป็นที่นิยมในไมโครคอนโทรลเลอร์เนื่องจากคำสั่งขนาดเล็กลงด้วยเหตุผลสองประการ:
ด้วยเหตุผลที่สองเมื่อรหัสของคุณไม่ต้องการฟังก์ชันการทำงานจากชุดคำสั่ง ARM รหัส THUMB จะทำงานได้เร็วขึ้น ทั้งนี้เป็นเพราะการเรียนการสอนของคุณสามารถดึงใน I / O รอบเดียวจากแฟลชแทนสอง ขึ้นอยู่กับความเร็วของส่วนต่อประสานแฟลชของคุณการอ่านครั้งที่สองนั้นอาจเกิดการรออย่างน้อยหนึ่งรอบต่อการเรียนการสอนที่ CPU ของคุณหยุดทำงานและไม่สามารถทำอะไรได้
สิ่งนี้จะกลายเป็นปัญหาน้อยลงถ้าคุณสามารถคัดลอกรหัสของคุณไปที่ RAM ก่อนที่จะดำเนินการ (ซึ่งฉันมักจะเห็นว่าเป็น 32- บิตสำหรับไมโครคอนโทรลเลอร์ ARM ล่าสุด) ซึ่งข้อกังวลเพียงอย่างเดียวคือความหนาแน่นของรหัส ด้วยเหตุนี้เครื่องมือจำนวนมากจะพยายามค้นหาว่าการแสดงใดมีประสิทธิภาพมากขึ้นสำหรับฟังก์ชันที่กำหนด หากคอมไพเลอร์สามารถสร้างรหัส THUMB ได้ในคำสั่งที่น้อยลง แต่ถ้า ARM ส่งผลให้มีคำสั่งน้อยลงคุณจะได้รับ ARM นี่เป็นโหมดเริ่มต้นสำหรับ Keil ถ้าฉันจำได้ถูกต้อง
สำหรับชิปเฉพาะของคุณ (AT91SAM7S32) เอกสารระบุว่าตัวควบคุมแฟลชมีบัฟเฟอร์การดึงข้อมูลล่วงหน้าที่สามารถทำนายการเข้าถึงเพื่อทำให้สิ่งต่าง ๆ มีประสิทธิภาพมากขึ้นซึ่งอาจปรับปรุงการปฏิบัติการสอนของ ARM อย่างไรก็ตามมันยังระบุด้วยว่า prefetch เป็นบัฟเฟอร์ "dual 32- บิต" ที่ "เพิ่มประสิทธิภาพการเข้าถึง 16 บิต" ซึ่งเหมาะสมที่สุดสำหรับ "การทำงานในโหมด Thumb" ซึ่งดูเหมือนว่าจะระบุว่ามันไม่ได้มีวัตถุประสงค์เพื่อเร่งความเร็ว คำสั่ง ARM แต่เพื่อให้แกนของคุณทำงานได้เร็วขึ้นในโหมด THUMB
จากไดอะแกรมดูเหมือนว่าแฟลชบนชิปของคุณมีบัสข้อมูล 32 บิต prefetcher ดูเหมือนว่าจะทำงานโดยการอ่าน 32 บิตทั้งหมดให้ 16 กับ CPU (ในโหมด THUMB) และแคช 32 บิตทั้งหมด ในระหว่างรอบถัดไปเมื่อ CPU อ่าน 16 บิตที่สองเวลานี้จากแคชตัวควบคุมแฟลชกำลังอ่าน 32 บิตถัดไปและทำการแคช ด้วยวิธีนี้รหัส THUMB สามารถทำงานได้โดยไม่ต้องรอนานกว่านั้นถึงแม้ว่าความเร็วของแฟลชจะช้ากว่าความเร็วคอร์ของ CPU เล็กน้อย ส่วนที่ 19.2.2 "การดำเนินการอ่าน" มีรายละเอียดเพิ่มเติม
เนื่องจากแฟลชของคุณเป็นบัส 32 บิต (ใกล้เท่าที่ฉันจะบอกได้) หาก CPU และนาฬิกาแฟลชของคุณเหมือนกัน THUMB จะให้รหัสที่มีความหนาแน่นมากกว่า ARM ถ้าคุณต้องการให้ซีพียูคอร์ของคุณทำงานเร็วกว่าแฟลช (และหมายเหตุฉันไม่ได้ตรวจสอบเวลาทั้งหมดของชิปนี้ฉันถือว่าซีพียูสามารถทำงานได้เร็วขึ้นเพราะพวกเขาให้คุณตั้งค่าสถานะรอ) กว่า prefetch ให้ความเร็ว ข้อดีของ THUMB เนื่องจากการลดลงของการเข้าถึงแฟลชจริง อย่างไรก็ตามความได้เปรียบด้านความเร็วนั้นเป็นข้อได้เปรียบต่อการเรียนการสอน หากจำนวนคำสั่ง THUMB เทียบกับคำสั่ง ARM มีขนาดใหญ่พอมันจะมีค่าเกินความเร็วการเรียนการสอนต่อเนื่องซึ่งส่งผลให้ ARM มีความเร็วต่อการทำงานปกติเร็วขึ้น