DSP algoritmalarını doğrudan C veya montajda mı yazıyorsunuz? [kapalı]


18

Derleyici paketi CrossCore Studio ile birlikte bir Analog Devices dijital sinyal işlemcisi (BF706) üzerinde bir DSP projesi (IIR filtreleme) üzerinde çalışıyorum. FIR ve IIR filtreleri ve bunun için kütüphane işlevleri gibi basit DSP öğeleri için bazı örnekleri vardır. İşlemci kılavuzu, montaj talimat setini açıklar ve C üzerinde yorum yapmaz.

Benim sorum bu özel uygulamadan kaynaklanıyor, ancak DSP geliştiricilerinin takip ettiği en iyi uygulamaların olduğunu düşündüm. Bu yüzden genel olarak çerçeveleyeceğim:

Bu DSP ile gelen örneklerle gerçekleştirdiğim şey, DSP uygulamaları için tasarlanmış devreleri kullanmak istersem, bu talimatları doğrudan çalıştırmak için montajda programlamam gerektiğidir. (Çarpma ve ekleme gibi) Sadece C'de programlıyorum, derleyici (DSP çip şirketinden de geliyor) onu bu DSP için optimize etmiyor ve yeteneklerini kullanmıyor mu? Yoksa doğrudan derlemede DSP yordamları yazmam gerekir mi?


17
Uzun yıllar ADSP-21xx için derleme yazdım (ve daha sonra Blackfin için derleme ve C). Ne kullandığınızı açıklamıyorsunuz, bu nedenle herhangi bir cevap her şeyden daha fazla bir tahmin ve fikir olacaktır. Ancak AD'nin DSP işlemcileri iyi şeyler karardır ve C derleyici yazarlarının boruyu düzgün bir şekilde doldurmaları çok zordur. Bu alanda yirmi yıllık tecrübem var (C derleyicisi yazma konusunda çok mütevazı bir deneyim dahil) ve kod yazmayı bıraktığım zamana kadar (birkaç yıl önce) C derleyicileri el kodlamasına yaklaşamadı. Ancak ne yaptığınız hedeflerinize bağlıdır.
jonk

1
@jonk Umarım buna bir cevap yazacaksın - Sadece bir tane hardcore DSP Blackfin projesi yaptım, ancak ihtiyaç duyduğu performans hacklerinin bazılarının anılarını
sevdim

6
@pericynthion Hayır, OP belirli DSP ve proje hedefleri hakkında ÇOK daha fazla konuşmadığı sürece buna bir cevap yazmayı hayal edemiyorum. Aksi takdirde, OP'nin bu konuda ne yazdığına bağlı olarak çok doğru veya çok yanlış olabilecek belirsiz, yönlendirilmemiş görüşler olacaktır. Sadece bekleyeceğim.
jonk

1
En hızlı çalışmasını istiyorsanız, montajda el ile optimize edin. Bu bir zaman \ para ödünleşimidir. Eğer iyi C yazmayı biliyorsanız, orada yolun çoğunu alabilirsiniz.
Voltaj Spike

2
Ben DSP konusunda emin değilim ama en mikroişlemciler için siz yapabilirsiniz kullanmak intrinsics yazma assembler ve C kodu arasında yarım.
Maciej Piechotka

Yanıtlar:


20

Sonunda montajdaki her şeyi uygulamayı planlasanız bile, algoritmanızın daha yüksek bir dilde (C'nin derleme ile karşılaştırıldığı) uygulanması her zaman daha iyidir.

  • büyük olasılıkla, montaj bile gerekmez . Derleyiciniz tarafından oluşturulan kod tasarım hedeflerinize uygunsa, işiniz yapılır.

  • değilse, derleme kodunuzu sıfırdan başlatmayacaksınız . Derleyicinin sizin için ilk kodu oluşturmasına izin verin ve bunu optimize edilmiş montaj sürümünüz için bir taban olarak kullanın.

  • daha sonra, optimize edilmiş montaj kodunuzu test etmeniz gerektiğinde, C sürümüne sahip olmaktan memnuniyet duyarsınız . Test giriş verileriniz için doğru çıktıyı manuel olarak hesaplamak yerine, bu giriş verilerini optimize edilmemiş C uygulamanıza besleyebilir, ardından montajın yaptığınız optimizasyonlardan sonra tam olarak aynı çıktıyı üretip üretmediğini kontrol edebilirsiniz.

Birkaç yıl sonra yeni bir geliştiricinin algoritmanızda değişiklik yapması gerekiyorsa ve elindeki tek şey son derece optimize edilmiş bir montaj kodu ise, sıfırdan başlamak zorunda olmaları için yüksek bir şans var.


23

Derleyici yazarları bu hedef için optimize etmek için biraz çaba harcarlarsa, en azından özel DSP talimatlarını / mimarisini biraz kullanırlar. Ancak nihai performans için asla elle ayarlanmış montaj kadar iyi olmayacaktır. Yine de yeterince iyi olabilir - uygulamanıza bağlıdır.

Diğer alternatifler:

  1. Programınızın çoğunu C'ye ve sadece derlemedeki en kritik sayısal kısma yazın.
  2. Programı C'ye yazın ve üretici veya üçüncü taraflar tarafından sağlanan kütüphaneleri kullanın - FFT'ler, FIR / IIR filtreleri vb. bunu kullanabilir (bunun için ödeme yapmanız gerekebilir) ve uygulamanıza bağlayabilirsiniz.

Genellikle, DSP satıcıları ortak işlevler için kaynak kodu sağlar. Kodları "yeterince iyi" ise, onu hemen bırakabilirsiniz. Eğer tam olarak doğru değilse, ince ayar yapmanız gerekir. Ben sadece bir frekans gerçek FFT elde etmek için birkaç yıl önce bir FFT katman yapmak zorunda kaldı. N-noktası karmaşık FFT olarak 2N-nokta gerçek FFT yapmanıza izin veren bir hile var, ancak daha sonra gerçek frekans verilerini kurtarmak için karmaşık çıktı üzerinde son bir geçiş yapmanız gerekiyor. Analog Devices, örnek kodlarında bu özel duruma sahip değildi.
John R. Strohm

21

Erken optimizasyon tüm kötülüklerin köküdür. - Donald Knuth

Kodunuzdan yeterli performans alamadığınızı fark ettiğinizde, önce programınızı profilleyin, tıkanıklıkları bulun, performans gereksinimlerinizi analiz edin ve yalnızca optimizasyon yapmaya başlayın. Montaj kodunun yazılması son çare.

Sorum şu ki, sadece C'de programlıysam, derleyici (DSP çip şirketinden de geliyor) onu bu DSP için optimize etmiyor ve yeteneklerini kullanmıyor mu?

Evet, C derleyicisi adil miktarda optimizasyon yapabilir. Ancak bu derleyicinin kalitesine bağlıdır. Genellikle, bir insan derlenmiş C kodundan daha hızlı montaj kodu yazabilir. İnsan acı ve ıstırap pahasına budur.

Yoksa doğrudan derlemede DSP yordamları yazmam gerekir mi?

Önce C'ye, sonra profile yazın, ardından montajda yazmanız gerekip gerekmediğine karar verin. Umarım, meclise ihtiyacınız olmaz.


20
Genel programlamada bu kesinlikle iyi bir tavsiyedir, ancak DSP biraz farklıdır - OP gerçekten bir DSP'yi verimli bir şekilde kullanmak istiyorsa, muhtemelen hat boyunca bir yerde el yazısı bir kod olması gerekecektir. Aslında DSP projeleri ile bazen işlemcinin eldeki göreve uygun olacağını doğrulamak için bu çekirdek sayısal çekirdeği yazarak başlamak isteyebilirsiniz.
pericynthion

11
Sonuç beyanınız iyi bir genel tavsiye niteliğindedir. Ancak, AD DSP ALU'larının belirli ayrıntıları göz önüne alındığında soluklaşıyor. Sanırım onları hiç inceledin.
jonk

18

Tüm boruların dolu olduğu varsayılarak, DSP'niz maksimum sürekli MAC'lerle tanıtılacaktır. Bu açık bir şekilde elde edilebilecek bir üst sınır. Analizlerinizden filtrelerinizin ve diğer işlemlerinizin kaç MAC alacağını biliyorsunuz. DSP çekirdeğini maksimumda çalıştıramayacağınız için ilkinin ikincisinin en az iki katı olmasını hedefleyin. Tıpkı% 70'lik bir kaynağın üzerinde bir FPGA doldurmaya çalışmamanız gibi (PAR bunun üzerinde çok yavaşlar), geliştirme son birkaç teorik MAC'yi bir DSP'den sıkmaya çalışırken çok yavaşlayabilir.

Tüm uygulamanızı C olarak kodlayacaksınız.Tümleyici, test enjeksiyonu ve görünürlük, temizlik vb. Tüm ekstra, gerekli şeyleri yazmak pratik değildir. Test filtresinin C versiyonunu yazın. Aslında bu canavar için montajcı yazabildiğinizi doğrulamak için aynı filtrenin montajcı sürümünü yazın.

Şimdi biraz zamanlama yapın. Tedarikçi tarafından onaylanmış bir RTOS kullanın. Test birleştirici modülünüzün çalışma süresini bir C sürümüyle karşılaştırın. Eğer yüzde birkaçının içindeyse, devam et. Üçlü ise, belgeleri okuyun, satıcıyı test edin ve derleyicinin neden ayarlamadığını öğrenin. Doğru derleyici bayraklarını ayarlamak için C'nin lezzetini yazmayı öğrenmeniz gerekebilir, derleyiciyi her şeyi yeniden derlemek için derleyiciyi düzgün bir şekilde nasıl kullanacağınızı bulmak daha hızlı olacaktır.

Tüm bunları bir DSP'ye, bir takım zincirine taahhüt etmeden önce yaptınız.

Çalışabileceğiniz bir araç zincirine sahip olduğunuzda, maksimuma en yakın olacak şekilde ayarlayabileceğiniz bir derleyici, bazı zamanlama boşluğu bırakılmış bir DSP, daha sonra kod paketinizin çok az bölümünün yerleştirilmesi gerekeceğinden emin olabilirsiniz. iş bitirmek için.


7

Bu soruyu daha önce yanıtlamış olmama rağmen, farklı bir bakış açısını göstermek için başka bir cevap ekleyeceğim:

C yazın, montajı okuyun!

Bu nedenle, derlemede yazmak yerine, mantığı C'ye yazacak ve C kodunun derleyici çıktısının optimum olduğundan emin olacaksınız. Montajcı çıktısını etkilemek için genellikle C kodunda belirli numaralar yapabilirsiniz. Mantıklı olduğunda statik satır içi işlevleri kullanın. DSP'nin desteklediği bazı özel talimatları kullanmanız gerekiyorsa, özel talimatın statik satır içi işlev soyutlamasını yapın ve soyutlamayı kullanarak özel talimatı arayın.

DSP'leri hiç programlamam gerektiğini söylememe rağmen, derlenmiş montajı dikkatle izlerken C kodunu yazma yaklaşımı benim için x86 makinelerinde çok iyi çalıştı. O kadar iyi ki, mümkün olan en iyi performansı elde etmek için montajda hiçbir zaman hiçbir şey yazmak zorunda kalmadım. Montaj kodu optimize yerine montaj en uygun şekilde C kodunu değiştirmek olacaktır.

Tabii ki, bu mevcut iyi C derleyicilerine bağlıdır. X86 için bu tür derleyiciler mevcuttur (genellikle varsayılandan daha yüksek bir optimizasyon düzeyi belirtmeniz gerekir). DSP'ler için, derleyicilerin iyi olup olmadığını bilmiyorum.

Bu yaklaşımın yararı, belirli bir DSP için en uygun montajla sonuçlanacak şekilde optimize edilmiş tek bir taşınabilir kod tabanına sahip olmanızdır, ancak DSP başka bir şeye değiştirilirse de çalışır. Elbette, yeni DSP'de mümkün olan en iyi performansı elde etmek için C kodunu biraz ayarlamanız gerekebilir.


Bununla ilgili bir sorum var: STM32F4 Cortex-M4 işlemciler üzerinde çalışıyorum ve CMSIS / Cube kütüphanelerini kullanıyorum. Derleyicinin -O3 bayrağını da kullanıyorum, çünkü üretebileceğim her şeyden daha verimli olmasının yolunu kanıtladı. Sorun, derlenmiş montajın doğru analiz için her zaman çok kaotik olmasıdır. Derleyici optimizasyonu olmadan her zaman derliyor musunuz? Yoksa her yerdeyse montaj arifesinde anlaşmayı mı başarıyorsunuz?
Florent

2
@FlorentEcochard: Derleyicinin derleyicisi bir programcı tarafından anlaşılamıyorsa, muhtemelen bu programcının yazabileceği derleyiciden daha iyidir. Sorunuza doğrudan cevap olarak: montajcının maksimum optimizasyonunu ve manuel analizini kullanın, zor kısımlar eğitici olabilir.
pasaba por aqui

4

Genel olarak, aşağıdaki durumlarda montajcı kaynakları yazmak gerekli değildir:

  • C'yi kritik bölümlerde optimize edersiniz: "register" anahtar kelimesi, satır içi işlevler, ...
  • asm bloklarını kullanan C programının bazı fonksiyonları olabilir

Bu , C derleyicisi tarafından oluşturulan birleştiriciyi manuel olarak gözden geçirmek (kritik parçalar için) ve yeterli optimizasyon düzeyine kadar kaynağı değiştirmek anlamına gelir .


Neredeyse tüm modern derleyiciler, platformdan bağımsız olarak "register" anahtar sözcüğünü yok sayar. Kullanmanın daha iyi kodla sonuçlanması pek olası değildir.
Kef Schecter

@KefSchecter: sadece kayıt ipucunu dikkate almıyorlar, bugünlerde kullanılacak kaydı seçmelerine bile izin veriyorlar
pasaba por aqui

1
@KefSchecter: gömülü cihazlar için yazılmış derleyiciler hariç, burada çıplak metal üzerinde programlama yapıyorsanız çok önemli bir anahtar kelimedir.
vsz

@pasabaporaqui: Şu sözdizimini biraz unuttum. Ancak, bir kayıt adı belirtmezseniz - diğer bir deyişle, ISO standardında kullanırsanız - GCC'nin bunu görmezden geleceğine eminim.
Kef Schecter

3

Burada FIR / IIR filtreleri kullanırsanız, hangi algoritmayı (önemsiz algoritmaya karşı hızlı Fourier dönüşümü (FFT)) kullandığınızdan (C'ye karşı montaj) çok daha önemli olduğunu söyleyebilirim.

Montajda FFT yazabilir miyim? Muhtemelen değil.

Kendime FFT yazabilir miyim? Bunun cevabı da muhtemelen değil, çünkü FFT zaten birçok kez uygulandı. Yani FFT zaten uygulanmış bazı kütüphane bulacaksınız. C'nin taşınabilir bir dil olduğu düşünüldüğünde, derleme olmasa da, C'de zaten varolan kütüphaneleri bulma olasılığınız daha yüksek olacaktır.

Mümkün olan en üst düzey performansı istiyorsanız, bir FFT algoritmasının montaj dilinde olabildiğince çabuk çalışması için el ile ayarlayabilirsiniz. Ama çok istisnai durumlar dışında bunu yapmanın mantıklı olduğuna gerçekten inanmıyorum.


2

Kendi görüşüm FWIW, istediğiniz zaman maksimum hız / verimlilik / verim / ne olursa olsun, montajcı, sizin yetkin olduğunuz sürece arkadaşınızdır. Bir derleyici aptal; yalnızca yazarının programlamak için ne düşündüğünü bilir ve yazarı başvurunuzu hiç bilmiyordu.

İtiraf etmeliyim ki, 80'li yılların başından beri 80'li yılların başından beri sevdim, "makine kodu" öğrenmenin bunlardan herhangi bir yararlı performans elde etmek için bir önkoşul olduğu birçok açıdan modern MCU'lardan farklı değil), ancak rolünün devam ettiğini düşünüyorum olarak maksimum verim için programa giderken. Ayrıca, bir derleyicinin düşünmeyeceği her türlü optimizasyon kısayolunu atabileceğiniz için son derece faydalıdır, çünkü bir derleyici hiç düşünemez.

C tamam sanırım. Ancak, makinenizin donanım düzeyinde ne yapmasını istediğinizi gerçekten biliyorsanız, montajcıya gidin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.