2013-03-14 20 views
6

Kayan nokta donanımı içermeyen bir mimari üzerinde çalışıyorum, ancak yalnızca 16 bit ALU ve 40 bit MAC.Ne zaman CORDIC veya polinom yaklaşımı kullanmak daha verimli?

Bu mimarideki yazılımlarda 32 bit tek kesinlikli kayan nokta toplama/çıkarma, çarpma, kosinüs, sinüs, bölme, karekök ve aralık azaltma işlemlerini zaten uygulamıştım.

ilk Sonra kosinüs Polinom yaklaşımlar ve aralık sinüs fonksiyonları bir kosinüs ve sinüs fonksiyonu hayata "ARGUMENT REDUCTION FOR HUGE ARGUMENTS" by K.C. NG kağıt anlatılan yöntem kullanılarak aralığı azalma kullanılan kosinüs ve sinüs uygulamak için -pi/4 ile + pi/4. Hart, ve ark., "Bilgisayar Yaklaşımları" kitabına başvurdum. Polinomlar için.

Ayrıca CORDIC algoritmasını düşünmem gerektiğini duydum. Ancak, daha önce kullandığım yönteme göre daha fazla veya daha az verimli olup olmayacağını (çıktı, bellek yükü ve gereken talimat sayısı) bilen var mı diye merak ediyordum. Yazılım işlevlerimi, her bir çekirdek özelliğin yalnızca 128 kelimelik yönerge belleği ve 128 adet 16 bitlik bir 16 bit veri belleğinin bulunduğu çok çekirdekli bir mimaride uygulamıştım. Ayrıca kosinüs ve sinüs için CORDIC algoritmasının nasıl uygulanacağını araştırmayı denedim, ancak 32-bit kayan nokta uygulamaları için iyi bir kaynak bulamadım. Herhangi bir öneri var mı?

Teşekkür ederiz!

+0

Mevcut uygulamanızla ilgili bir performans sorununuz var mı? –

+0

Performans oldukça yavaş. Ayrıca bir yazılım kayan nokta çarpan veya toplayıcı veya benim için her ikisi de mevcut olsa bile, yazılım uygulamaları karşılaştırmak için gidiyorum. Aklıma her zaman sahip olduğum bir soru, ne CORDIC hakkında, ve bu oyuna nasıl giriyor? Bir seçenek olarak göz ardı etmeli miyim? Niye ya? 32-bit kayan nokta için bu soruyu cevaplamak için iyi bir kaynak bulamadım. – Veridian

+0

Polinomları değerlendirmek için Horner'ı kullandınız mı? Hangi derece polinomları kullandınız? –

cevap

6

CORDIC size döngü yineleme başına bir bit kazandırır, bu nedenle yazılımda uygulanması muhtemelen polinom sürümünüzden daha yavaş olacaktır. Bu da CORDIC'in yazılım uygulamalarına ilişkin makaleleri bulmanın zor olmasının nedeni olabilir: performansı düşüktür, dolayısıyla kimse rahatsız etmez.

Yorumunuzu yapınız: Horner's method, katsayıları tekrar tekrar ekleyerek ve sonra x değişkeniyle çarparak polinomları en yüksek mertebe katsayısından en alta doğru değerlendirme pratiğidir. Tersine, naif usul (yani, önce x'un güçlerini değerlendirmek, sonra bunları katsayıları ile çarpmak ve bunları bir araya getirmek) daha fazla iş gerektirir ve Horner yönteminden daha az sayısal olarak kararsız olabilir.

Size polinomları değerlendirmek için çalışıyoruz, bu yüzden bir formül önerir tam olarak nasıl bahsetmedim:

x2 = x * x 
cos = ((COS_D * x2 + COS_C) * x2 + COS_B) * x2 + COS_A 
sin = (((SIN_D * x2 + SIN_C) * x2 + SIN_B) * x2 + SIN_A) * x 

Not baştan aralığına sabitleri adapte eğer daha iyi hassasiyet elde edebilirsiniz Taylor katsayılarını kullanmak yerine, işlevi değerlendirmekte olduğunuz. muhtemelen sadece sahip olduğu (


Bu muhtemelen dava için daha az alakalı olan (Yine ... özür Eğer bu şeylerin bir kısmını veya tamamını yaptıysam, ama sen zaten denedim ne olduğunu söz etmedi) Bir 16x16-bit MAC), ancak eğer işlemciniz aynı anda birden fazla aritmetik değerlendirmeyi başlatabilirse, değerlendirmelerinizi ağaç benzeri bir şekilde yazarsanız, işlemlerin sıralı bağımlılıklarından bazılarını kaçınarak daha iyi performans elde edebilirsiniz:

x2 = x * x 
x4 = x2 * x2 
cos = (COS_D * x2 + COS_C) * x4 + (COS_B * x2 + COS_A) 
sin = ((SIN_D * x2 + SIN_C) * x4 + (SIN_B * x2 + SIN_A)) * x 

İşlemciniz bir ALU vektörüne sahipse, bu formülde bunun için de verimli bir kullanım önerilmektedir ...

+3

FWIW, ikinci değerlendirme programınıza Estrin'in yöntemi denir. –

+2

BTW, Jean-Michel Muller'ın – comingstorm

+0

@comingstorm tarafından, Estrin'in yöntemindeki wikipedia makalesinde atıfta bulunulan kitabı tavsiye ederim: _Marner'ın metodu muhtemelen bana daha yüksek verim sağladı ve daha kolay anlaşılır bir veriyolu. . – Veridian

3

MAC eşdeğer bir geçiş sırasından önemli ölçüde daha hızlıysa ve ekler ve eklerse, bir polinom kullanın; CORDIC'i bile dikkate almayın (muhtemelen tek bir adım veya iki alan küçültme hariç).FP CORDIC algoritmalarını tam olarak bulmak zordur, çünkü bu kriterler her zaman FP'nin kullanıldığı herhangi bir sistem için geçerlidir (geçmiş 35 yıl içinde), bu yüzden CORDIC dikkate alınmaz.

+0

Teşekkür ederiz! Bu tam olarak aradığım analiz türüdür. – Veridian

+0

Bu yazı ne hakkında? http://www.acsel-lab.com/arithmetic/papers/ARITH11/ARITH11_Hekstra.pdf – Veridian

İlgili konular