กำลังเขียนอัลกอริธึม DSP โดยตรงใน C หรือแอสเซมบลีหรือไม่ [ปิด]


18

ฉันกำลังทำงานในโครงการ DSP (การกรอง IIR) ในตัวประมวลผลสัญญาณดิจิตอล Analog Devices (BF706) ด้วยชุดคอมไพเลอร์ที่มาพร้อมกับ CrossCore Studio มันมีตัวอย่างบางอย่างสำหรับสิ่ง DSP ง่าย ๆ เช่นตัวกรอง FIR และ IIR และฟังก์ชั่นห้องสมุดสำหรับมัน คู่มือตัวประมวลผลอธิบายชุดคำสั่งการประกอบและไม่แสดงความคิดเห็นใน C.

คำถามของฉันเกิดขึ้นจากแอปพลิเคชันนี้โดยเฉพาะ แต่ฉันคิดว่ามีวิธีปฏิบัติที่ดีที่สุดที่ผู้พัฒนา DSP ติดตาม ดังนั้นฉันจะจัดวางในลักษณะทั่วไป:

สิ่งที่ฉันได้รับจากตัวอย่างที่มาพร้อมกับ DSP นี้คือถ้าฉันต้องการใช้วงจรที่ออกแบบมาสำหรับแอพพลิเคชั่น DSP ฉันต้องโปรแกรมในแอสเซมบลีเพื่อเรียกใช้คำแนะนำเหล่านั้นโดยตรง (เช่นทวีคูณและเพิ่มเป็นต้น) คำถามของฉันคือ ฉันเพิ่งเขียนโปรแกรมใน C คอมไพเลอร์ (ซึ่งมาจาก บริษัท ชิป DSP) จะไม่ปรับให้เหมาะสมสำหรับ DSP นั้นและใช้ความสามารถของมันหรือไม่ หรือฉันจำเป็นต้องเขียนกิจวัตร DSP โดยตรงในการประกอบจริง ๆ ?


17
ฉันใช้เวลาหลายปีในการเขียนชุดประกอบสำหรับ ADSP-21xx (และชุดประกอบและ C สำหรับแบล็กฟินในภายหลัง) คุณไม่เปิดเผยสิ่งที่คุณกำลังใช้ดังนั้นคำตอบใด ๆ จะเป็นการเดาและความเห็นมากกว่าสิ่งอื่นใด แต่ตัวประมวลผล DSP ของโฆษณานั้นได้รับสิ่งที่ดีและมันยากมากสำหรับนักเขียนคอมไพเลอร์ C ที่จะเติมท่ออย่างถูกต้อง ฉันมีประสบการณ์สองทศวรรษในพื้นที่นี้ (รวมถึงประสบการณ์ที่เรียบง่ายมากในการเขียนคอมไพเลอร์ C) และจนถึงเวลาที่ฉันหยุดเขียนโค้ด (ไม่กี่ปีที่ผ่านมา) คอมไพเลอร์ C ไม่สามารถเข้าใกล้การเขียนโค้ดด้วยมือ แต่สิ่งที่คุณทำขึ้นอยู่กับเป้าหมายของคุณ
jonk

1
@ จอนหวังว่าคุณจะเขียนคำตอบสำหรับเรื่องนี้ - ฉันทำโครงการ DSP Blackfin ไม่ยอมใครง่ายๆเพียงครั้งเดียว แต่ฉันชอบความทรงจำเกี่ยวกับการแสดงบางอย่างที่มันจำเป็นต้องใช้ :)
pericynthion

6
@pericynthion ไม่ฉันไม่สามารถจินตนาการการเขียนคำตอบได้เว้นแต่ OP จะพูดถึงอีกมากมายเกี่ยวกับ DSP และเป้าหมายของโครงการ มิฉะนั้นมันจะคลุมเครือความคิดเห็นที่ไม่ถูกต้องซึ่งอาจถูกหรือผิดมากขึ้นอยู่กับสิ่งที่ OP นั้นเขียนเกี่ยวกับมัน ดังนั้นฉันจะรอ
jonk

1
หากคุณต้องการให้มันรันเร็วที่สุดคุณต้องปรับมันให้เหมาะสมในการประกอบ นั่นคือเวลา \ เงินแลกเปลี่ยน หากคุณรู้วิธีการเขียน C ที่ดีคุณจะได้รับประโยชน์สูงสุดจากที่นั่น
Spike ของแรงดัน

2
ฉันไม่แน่ใจเกี่ยวกับ DSP แต่สำหรับไมโครโปรเซสเซอร์ส่วนใหญ่คุณสามารถใช้อินทิลิตี้ ซึ่งอยู่กึ่งกลางระหว่างการเขียนแอสเซมเบลอร์และรหัส C
Maciej Piechotka

คำตอบ:


20

มันจะดีกว่าเสมอที่จะใช้อัลกอริทึมของคุณในภาษาระดับสูงกว่า (ซึ่ง C เทียบกับชุดประกอบ) แม้ว่าคุณวางแผนที่จะใช้ทุกอย่างในชุดประกอบในตอนท้าย

  • โอกาสที่คุณจะไม่จำเป็นต้องแม้การชุมนุม หากโค้ดที่คอมไพเลอร์สร้างขึ้นนั้นตรงตามเป้าหมายการออกแบบของคุณงานของคุณก็จะเสร็จสิ้น

  • ถ้าไม่คุณจะไม่ได้รับการเริ่มต้นของการประกอบการเข้ารหัสจากรอยขีดข่วน ให้คอมไพเลอร์สร้างรหัสเริ่มต้นสำหรับคุณและใช้เป็นพื้นฐานสำหรับเวอร์ชันแอสเซมบลีที่ดีที่สุดของคุณ

  • ในภายหลังเมื่อคุณจะต้องทดสอบรหัสแอสเซมบลีที่ดีที่สุดของคุณคุณจะดีใจที่มีรุ่น C แทนที่จะคำนวณผลลัพธ์ที่ถูกต้องสำหรับข้อมูลอินพุตทดสอบของคุณด้วยตนเองคุณสามารถป้อนข้อมูลอินพุตนั้นไปยังการใช้งาน C ที่ไม่ได้เพิ่มประสิทธิภาพของคุณจากนั้นตรวจสอบว่าชุดประกอบสร้างเอาต์พุตเดียวกันทุกประการหลังจากการปรับให้เหมาะสม

หากไม่กี่ปีที่ผ่านมานักพัฒนาใหม่จะต้องทำการปรับเปลี่ยนอัลกอริทึมของคุณและสิ่งที่พวกเขามีอยู่ก็คือรหัสการประกอบที่มีประสิทธิภาพสูงสุดมีโอกาสสูงที่พวกเขาจะต้องเริ่มจากศูนย์


23

หากผู้เขียนคอมไพเลอร์ใช้ความพยายามในการปรับให้เหมาะสมสำหรับเป้าหมายนั้นอย่างน้อยก็จะใช้ประโยชน์จากคำแนะนำ / สถาปัตยกรรม DSP พิเศษ แต่เพื่อประสิทธิภาพที่ดีที่สุดมันจะไม่ดีเท่าชุดปรับมือ มันอาจจะดีพอ แต่ขึ้นอยู่กับใบสมัครของคุณ

ทางเลือกอื่น ๆ ได้แก่ :

  1. เขียนโปรแกรมส่วนใหญ่ของคุณใน C และเป็นเพียงส่วนที่สำคัญที่สุดในการประกอบ
  2. เขียนโปรแกรมใน C และใช้ไลบรารีที่จัดทำโดยผู้ผลิตหรือบุคคลที่สาม - ถ้าคุณกำลังทำภารกิจ DSP ทั่วไปเช่น FFTs, ตัวกรอง FIR / IIR เป็นต้นบางคนอาจเขียนรหัสเครื่องที่ปรับด้วยมือแล้วดังนั้นคุณจึง สามารถใช้งานได้ (คุณอาจต้องชำระเงิน) และเชื่อมโยงกับแอปพลิเคชันของคุณ

โดยทั่วไปผู้ขาย DSP จะจัดหาซอร์สโค้ดสำหรับฟังก์ชั่นทั่วไป หากรหัสของพวกเขาคือ "ดีพอ" คุณสามารถวางลงได้หากมันไม่ถูกต้องคุณต้องปรับแต่งมัน ฉันต้องทำเลเยอร์ FFT หลายปีที่ผ่านมาเพื่อรับ FFT จริงเฉพาะความถี่ มีเคล็ดลับที่ช่วยให้คุณสามารถทำ FFT จริง 2N-point เป็น N-point complex FFT ได้ แต่จากนั้นคุณต้องผ่านขั้นตอนสุดท้ายผ่านเอาต์พุตที่ซับซ้อนเพื่อกู้คืนข้อมูลความถี่จริง อุปกรณ์อะนาล็อกไม่ได้มีกรณีเฉพาะในรหัสตัวอย่าง
John R. Strohm

21

การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด - Donald Knuth

เมื่อคุณพบว่าคุณมีประสิทธิภาพไม่เพียงพอจากรหัสของคุณให้ทำการโปรไฟล์โปรแกรมของคุณก่อนค้นหาคอขวดวิเคราะห์ความต้องการด้านประสิทธิภาพของคุณแล้วเริ่มทำการปรับให้เหมาะสม การเขียนรหัสชุดประกอบเป็นวิธีสุดท้าย

คำถามของฉันคือถ้าฉันเพิ่งเขียนโปรแกรมใน C คอมไพเลอร์ (ซึ่งมาจาก บริษัท ชิป DSP) จะปรับให้เหมาะสมสำหรับ DSP นั้นและใช้ความสามารถของมันหรือไม่

ใช่คอมไพเลอร์ C สามารถเพิ่มประสิทธิภาพได้ในระดับที่เหมาะสม แต่สิ่งนี้ขึ้นอยู่กับคุณภาพของคอมไพเลอร์ บ่อยครั้งที่มนุษย์สามารถเขียนรหัสการประกอบได้เร็วกว่ารหัส C ที่คอมไพล์แล้ว ความเจ็บปวดและความทุกข์ทรมานของมนุษย์เป็นค่าใช้จ่ายจำนวนมาก

หรือฉันจำเป็นต้องเขียนกิจวัตร DSP โดยตรงในการประกอบจริง ๆ ?

ก่อนเขียนใน C จากนั้นโพรไฟล์แล้วตัดสินใจว่าคุณต้องการเขียนในแอสเซมบลี หวังว่าคุณจะไม่ต้องการการชุมนุม


20
โดยทั่วไปแล้วการเขียนโปรแกรมนี้เป็นคำแนะนำที่ดี แต่ DSP แตกต่างกันเล็กน้อย - ถ้า OP ต้องการใช้ DSP อย่างมีประสิทธิภาพจริง ๆ คงต้องมีโค้ดที่เขียนด้วยลายมืออยู่แถวใดบรรทัดหนึ่ง และในความเป็นจริงกับโครงการ DSP บางครั้งคุณอาจต้องการเริ่มต้นด้วยการเขียนเคอร์เนลที่เป็นตัวเลขแกนกลางเพื่อตรวจสอบว่าโปรเซสเซอร์นั้นเหมาะสำหรับงานในมือ
pericynthion

11
ข้อความสรุปของคุณคือคำแนะนำทั่วไปที่ดี แต่มันค่อนข้างซีดเมื่อพิจารณารายละเอียดเฉพาะของ AD DSP ALU ฉันไม่คิดว่าคุณเคยตรวจสอบพวกเขา
jonk

18

DSP ของคุณจะได้รับการโฆษณาด้วย MAC ที่ยั่งยืนสูงสุดโดยสมมติว่ามีการเติมท่อทั้งหมด เห็นได้ชัดว่าเป็นข้อ จำกัด สูงสุดในสิ่งที่สามารถทำได้ คุณรู้ว่า MAC ของคุณจะใช้ตัวกรองและการประมวลผลอื่นจำนวนเท่าใดจากการวิเคราะห์ของคุณ ตั้งเป้าหมายให้มีอย่างน้อยสองครั้งแรกในวินาทีเนื่องจากคุณจะไม่สามารถทำให้คอร์ DSP ทำงานได้สูงสุด เช่นเดียวกับที่คุณจะไม่พยายามเติม FPGA ที่มีทรัพยากรสูงกว่า 70% (PAR จะช้ากว่านั้น) การพัฒนาอาจช้ามากที่พยายามบีบ MACs เชิงทฤษฎีสองสามตัวออกมาจาก DSP

คุณจะเขียนโค้ดใบสมัครทั้งหมดของคุณเป็น C ไม่สามารถเขียนพิเศษสิ่งที่จำเป็นทั้งหมดในแอสเซมเบลอร์การทดสอบการฉีดและการมองเห็นการทำความสะอาด ฯลฯ เขียนเวอร์ชัน C ของฟิลเตอร์ทดสอบ เขียนเวอร์ชั่นแอสเซมเบลอร์ของตัวกรองเดียวกันเพื่อตรวจสอบว่าคุณสามารถเขียนแอสเซมเบลอร์สำหรับสัตว์ร้ายนี้ได้จริง

ตอนนี้ทำเวลา ใช้ RTOS ที่ได้รับอนุมัติจากซัพพลายเออร์ เปรียบเทียบเวลาทำงานของโมดูลแอสเซมเบลอร์ทดสอบของคุณกับเวอร์ชัน C หากพวกเขาภายในไม่กี่เปอร์เซ็นต์ให้ย้ายไป ถ้าเป็นสามเท่าให้อ่านเอกสารตอบคำถามผู้ขายและหาสาเหตุที่คอมไพเลอร์ไม่ปรับจูน คุณอาจต้องเรียนรู้ที่จะเขียนรสชาติของ C มากพอ ๆ กับการตั้งค่าสถานะคอมไพเลอร์ที่ถูกต้องมันจะเร็วกว่าที่จะค้นหาวิธีการขับคอมไพเลอร์อย่างถูกต้องมากกว่าเขียนทุกอย่างในแอสเซมเบลอร์

คุณได้ทำสิ่งนี้ทั้งหมดก่อนที่จะส่งมอบให้กับ DSP ไปยังกลุ่มเครื่องมือ

เมื่อคุณมี toolchain ที่คุณสามารถใช้งานได้คอมไพเลอร์คุณสามารถปรับแต่งเพื่อให้ได้ใกล้เคียงกับค่าสูงสุด DSP ที่เหลือ headroom การกำหนดเวลาไว้จากนั้นคุณสามารถมั่นใจได้อย่างมั่นใจว่าชิ้นส่วนของชุดรหัสของคุณจะต้องใส่เข้าไป แอสเซมเบลอร์เพื่อเสร็จสิ้นงาน


7

แม้ว่าฉันจะตอบคำถามนี้ไปแล้ว แต่ฉันจะเพิ่มคำตอบเพื่อแสดงมุมมองที่แตกต่าง:

เขียนเป็น C อ่านในชุดประกอบ!

ดังนั้นแทนที่จะเขียนในชุดประกอบคุณจะเขียนตรรกะใน C อย่างระมัดระวังตรวจสอบให้แน่ใจว่าผลลัพธ์ของแอสเซมเบลอร์ของรหัส C นั้นเหมาะสมที่สุด คุณมักจะสามารถใช้เทคนิคบางอย่างในรหัส C เพื่อส่งผลกระทบต่อการส่งออกประกอบ ใช้ฟังก์ชั่นอินไลน์แบบคงที่เมื่อมันทำให้รู้สึก หากคุณต้องการใช้คำแนะนำพิเศษที่ DSP รองรับให้ทำฟังก์ชั่นอินไลน์แบบนามธรรมของคำสั่งพิเศษและเรียกคำสั่งพิเศษโดยใช้สิ่งที่เป็นนามธรรม

แม้ว่าฉันต้องบอกว่าฉันไม่เคยตั้งโปรแกรม DSP แต่วิธีการเขียนรหัส C ในขณะที่การสังเกตการประกอบชุดที่รวบรวมนั้นได้ผลสำหรับฉันในเครื่อง x86 อย่างดีมาก ที่จริงแล้วฉันไม่เคยเขียนอะไรในชุดประกอบเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดเท่าที่จะเป็นไปได้ ฉันจะแทนที่จะปรับรหัสแอสเซมบลีให้เหมาะสมที่สุดแก้ไขโค้ด C ในลักษณะที่แอสเซมบลีที่ดีที่สุด

แน่นอนขึ้นอยู่กับคอมไพเลอร์ C ที่ดีที่มีอยู่ สำหรับคอมไพเลอร์ x86 นั้นมีอยู่ (คุณมักจะต้องระบุระดับการปรับให้เหมาะสมที่สูงกว่าค่าเริ่มต้น) สำหรับ DSP ฉันไม่ทราบเลยว่าคอมไพเลอร์นั้นดีหรือไม่

ประโยชน์ของวิธีนี้คือคุณมี codebase แบบพกพาเพียงอันเดียวซึ่งปรับให้เหมาะกับการประกอบ DSP ที่เหมาะสม แต่มันก็ใช้ได้เช่นกันถ้า DSP เปลี่ยนไปเป็นอย่างอื่น แน่นอนคุณอาจต้องปรับรหัส C เล็กน้อยเพื่อให้ได้ประสิทธิภาพที่ดีที่สุดใน DSP ใหม่


ฉันมีคำถามเกี่ยวกับสิ่งนี้: ฉันทำงานกับโปรเซสเซอร์ STM32F4 Cortex-M4 และฉันใช้ไลบรารี CMSIS / Cube ฉันยังใช้แฟล็ก -O3 ของคอมไพเลอร์เพราะมันพิสูจน์แล้วว่ามีประสิทธิภาพมากกว่าสิ่งใดที่ฉันสามารถผลิตได้ ปัญหาคือชุดประกอบที่รวบรวมนั้นมีวิธีที่ไม่เป็นระเบียบเสมอไปสำหรับการวิเคราะห์ที่เหมาะสม คุณรวบรวมโดยไม่มีการเพิ่มประสิทธิภาพของคอมไพเลอร์เสมอหรือไม่? หรือคุณจัดการเพื่ออีเว้นท์อีเว้นท์อีเว้นท์ถ้ามันจบไปแล้ว?
Florent

2
@FlorentEcochard: หากโปรแกรมเมอร์ไม่สามารถเข้าใจแอสเซมเบลอร์ของคอมไพเลอร์ได้อาจจะดีกว่าแอสเซมเบลอร์ที่โปรแกรมเมอร์นี้สามารถเขียนได้ ในฐานะที่เป็นคำตอบสำหรับคำถามของคุณโดยตรง: ใช้การเพิ่มประสิทธิภาพสูงสุดและการวิเคราะห์ด้วยตนเองของแอสเซมเบลอร์ส่วนที่ยากอาจให้ความรู้ได้
pasaba por aqui

4

โดยทั่วไปแล้วไม่จำเป็นต้องเขียนแหล่งตัวประกอบหาก:

  • คุณเพิ่มประสิทธิภาพ C ในส่วนที่สำคัญ: การใช้คำสำคัญ "register" ที่ดีฟังก์ชั่นแบบอินไลน์ ...
  • อาจเป็นฟังก์ชั่นบางอย่างของโปรแกรม C โดยใช้asm blocks

นั่นหมายถึงการตรวจสอบแอสเซมเบลอร์ที่สร้างขึ้นโดยคอมไพเลอร์ C (สำหรับชิ้นส่วนที่สำคัญ) ด้วยตนเองและแก้ไขแหล่งที่มาจนกว่าระดับการปรับให้เหมาะสมเพียงพอ


คอมไพเลอร์สมัยใหม่ทั้งหมดแทบจะเพิกเฉยต่อคำค้นหา "register" โดยไม่คำนึงถึงแพลตฟอร์ม การใช้มันไม่น่าจะส่งผลให้รหัสที่ดีขึ้น
Kef Schecter

@KefSchecter: ไม่เพียง แต่พวกเขาคำนึงถึงคำแนะนำการลงทะเบียนทุกวันนี้พวกเขายังอนุญาตให้เลือกการลงทะเบียนที่จะใช้: gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/ ......
pasaba por aqui

1
@KefSchecter: ยกเว้นคอมไพเลอร์ที่เขียนขึ้นสำหรับอุปกรณ์ฝังตัวซึ่งเป็นคำหลักที่สำคัญมากหากคุณกำลังเขียนโปรแกรมบนโลหะเปลือย
vsz

@pasabaporaqui: ฉันลืมเรื่องของไวยากรณ์ไปหน่อย แต่ถ้าคุณไม่ระบุชื่อลงทะเบียน - กล่าวอีกนัยหนึ่งถ้าคุณใช้ในมาตรฐาน ISO - ฉันจะเดิมพัน GCC จะไม่สนใจมัน
Kef Schecter

3

ฉันจะบอกว่าที่นี่ถ้าคุณทำฟิลเตอร์ FIR / IIR มันสำคัญกว่าที่อัลกอริทึมที่คุณใช้ (อัลกอริทึมแบบเล็กน้อยเมื่อเทียบกับการแปลงฟูริเยร์เร็ว (FFT)) มากกว่าภาษาที่คุณใช้ (C เทียบกับชุดประกอบ)

ฉันจะเขียน FFT ในการชุมนุมหรือไม่ อาจจะไม่.

ฉันจะเขียน FFT เองได้ไหม คำตอบสำหรับเรื่องนี้ก็อาจจะไม่เช่นกันเนื่องจาก FFT ได้รับการดำเนินการหลายครั้งแล้ว โอกาสที่คุณจะได้พบกับห้องสมุดที่มีการดำเนินการ FFT แล้ว เมื่อพิจารณาว่า C เป็นภาษาพกพาในขณะที่แอสเซมบลีไม่คุณจะพบว่ามีไลบรารีที่มีอยู่ใน C

หากคุณต้องการประสิทธิภาพสูงสุดที่เป็นไปได้มากที่สุดคุณสามารถปรับแต่งอัลกอริทึม FFT ด้วยมือเพื่อให้ทำงานได้เร็วที่สุดในภาษาแอสเซมบลี แต่ฉันไม่เชื่อจริง ๆ ว่ามันสมเหตุสมผลที่จะทำเช่นนั้นยกเว้นในสถานการณ์ที่พิเศษมาก


2

มุมมองของฉันเอง FWIW คือทุกครั้งที่คุณต้องการความเร็วสูงสุด / ประสิทธิภาพ / ปริมาณงาน / อะไรก็ตามผู้ประกอบเป็นเพื่อนของคุณตราบใดที่คุณมีความเชี่ยวชาญ คอมไพเลอร์เป็นใบ้ มัน "รู้" เฉพาะสิ่งที่ผู้เขียนคิดว่าจะเขียนโปรแกรมลงไปและผู้เขียนไม่รู้จักใบสมัครของคุณเลย

ฉันต้องยอมรับว่าฉันรักแอสเซมเบลอร์มาตั้งแต่ต้น 80 บิต 8 บิตไมโครซอฟท์ (ซึ่งไม่เหมือนกันกับ MCU ที่ทันสมัยในหลาย ๆ ด้าน) ซึ่งการเรียนรู้ "รหัสเครื่อง" เป็นสิ่งที่จำเป็นสำหรับการทำงานที่มีประโยชน์ เป็นวิธีการโปรแกรมให้มีประสิทธิภาพสูงสุด ยิ่งไปกว่านั้นมันเป็นรางวัลที่สูงมากเนื่องจากคุณสามารถใช้ทางลัดที่เหมาะสมเพื่อให้คอมไพเลอร์ไม่คิดเพราะคอมไพเลอร์ไม่สามารถคิดได้เลย

C ก็โอเคฉันเดา แต่ถ้าคุณรู้ว่าคุณต้องการให้เครื่องทำอะไรในระดับฮาร์ดแวร์ให้ไปที่แอสเซมเบลอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.