Sabit nokta ile kayan nokta hesaplamasının göreli değerleri?


9

Çift hassas kayan noktalı sayıları kullanarak hızlı bir x86 makinesinde çalışan bir dijital sinyal işleme sistemim var . Gerçekte kayan nokta gösteriminin dev dinamik aralığını gerçekten kullanmıyorum - tüm miktarlar ± 32768 aralığına kolayca sığar.

Benim sorum: Sabit nokta hesaplamalara geçmenin sayısal doğruluk (yüksek öncelik) veya hesaplama süresinde (düşük öncelik) fayda sağlaması mümkün müdür ?

Elbette cevap, sabit nokta hesaplaması için kaç bitin mevcut olduğuna bağlıdır. Tipik sabit noktalı sistemler kaç hassasiyet kullanır? X86-64 üzerinde 64 bit ( 16 bit tam sayı kısmı, 48 bit kesirli kısmı ) ile sabit nokta hesaplamaları verimli bir şekilde yapılabilir mi?

Her zaman sabit nokta hesaplamalarının yalnızca CPU gücünün sınırlı olduğu durumlarda kullanıldığını düşünmüştüm - CPU gücü endişe duymadığında sabit nokta hesaplamaları kullanmak mantıklı mı?


Çift hassasiyetli kayan nokta değerinin size verdiği ~ 15 önemli rakamdan daha fazlasına ihtiyacınız var mı? Geniş genellemeler kötü olsa da, tüm sabit noktalı DSP sistemlerinin toplamına bakarsanız, 16 bit tam sayıların en yaygın biçim olacağını söyleyebilirim.
Jason R

Yanıtlar:


7

Tamsayıların sayısal doğruluğu, yalnızca tamsayı çözünürlüğü daha iyi ise, kayan sayıların sayısal doğruluğundan daha iyi olacaktır. Çiftler 52 kesirli bite sahiptir, bu nedenle çift duyarlıklı şamandıralar, etrafındaki tamsayılardan daha kötü bir çözünürlüğe sahiptir.25232768'den çok daha büyük (215). Yani, hayır, tamsayılara giderseniz sayısal doğruluk daha iyi olmayacaktır.

İkinci konu hız. Cevap: donanıma bağlıdır. Programınızı çoklu sabit nokta çarpma / biriktirme çekirdeklerine sahip bir dijital sinyal işlemcisi üzerinde çalıştırıyorsanız, evet, sabit noktada çok daha hızlı olacaktır. Diğer taraftan, bir x86 çipinde, sabit noktada muhtemelen daha yavaş olacaktır . Tam olarak bahsettiğiniz şeyi bir kez yaptım ve infaz sürelerimin arttığını gördüm.

İnternette bazı aramalar yaptıktan sonra bunun yaygın olduğunu öğrendim. Bunun nedeni, sabit nokta donanımına işaretçi aritmetiği gibi normal sabit nokta eylemiyle paylaşılırken, sabit noktaya geçiş yaptığınızda hiçbir şey yapmayan özel bir kayan nokta işlemcisine sahip olmasıdır.

İşlemeyi hızlandırmak istiyorsanız, bunu yapmanın yolu çift duyarlıklı şamandıralardan tek duyarlıklı şamandıralara geçiş yapmaktır. Bu, hızda önemli bir artış sağlamalıdır. Bu elbette sayısal doğruluğunuzu azaltacaktır.


Benim yazdığımda bu cevabın söylediklerini kastediyordum. Bu daha iyi. Yanılmıyorsam, bazı bilgisayarlarda (64 bit belki?) Yerel donanım kayan nokta tipinin çift olduğu bir yerde okudum, bu yüzden tek duyarlıklı (dört bayt) şamandıralar kullanmak aslında daha yavaş olabilir. Zaten bu dikkate alınması gereken bir şey.
heltonbiker

Tek hassas şamandıralar 23 bit mantis, çiftler 52 bit var.
Paul R

Çift hassas kayan noktaya alternatif olarak 16 bit tamsayı + 48 bit kesiti öneriyorum. Değerlerimin bu aralığa kolayca sığacağını belirtmek için 32768'den bahsettim. Bu değerlerin kısıtlanması göz önüne alındığında, Q16.48'in çift kesinlikli kayar noktadan daha fazla sayısal doğruluk sağlayacağını düşünüyorum.
nibot

1
@nibot Tamam. Çiftler -16'dan +16'ya kadar daha iyi bir hassasiyete sahip olacak ve kesirli tamsayılar -32769 ve +32768'e kadar başka yerlerde daha iyi hassasiyete sahip olacaktır. Elbette bunun ötesinde hiçbir şeyi temsil edemediler. Onlar da iki kattan daha yavaş olurdu. Benim için sınırlı aralık ve yavaş hız anlaşma kırıcılar olurdu, ama YMMV.
Jim Clay

6

Sabit noktanın esası çoğunlukla güç anlamındadır (işlemci donanım seçeneğiniz olduğunda veya işlemci kullanılmayan işlevsel birimleri kapatmakta iyidir). Bunun nedeni, sabit nokta birimlerinin belirli bir teknoloji ve çalışma sorun oranı için kayan noktadan daha küçük (daha az transistör, daha kısa kablo, MAC başına üstesinden gelmek için daha az kapasitans) olmasıdır.

Bununla birlikte, çok sayıda ortak çağdaş işlemciler (sunucu, PC ve hatta mobil), tamsayı çarpanlarından daha fazla ve daha hızlı FPU'lara (özellikle tek duyarlıklı FP birimleri) sahiptir ve sistem gücünün çoğu FPU'yu kullanmaktan değildir, bu nedenle sabit - noktasının bu ürünlerdeki tipik DSP hesaplaması için çok az avantajı olacaktır veya hiç bir avantajı olmayacak ve muhtemelen saf performans açısından bir dezavantaj olabilir. Mevcut teknolojiyi kullanarak, sabit noktaya yapılan herhangi bir avantaj çoğunlukla düğme boyutlu cihazlar gibi küçük gömülü ürünlerde tahakkuk edecektir.

Ancak bellek ve işlemci önbellek ayak izlerini de dikkate alın. Veri önbelleğinde büyük bir hesaplamaya tam uyacak şekilde daha küçük veri türlerinin (kısa int ve float) akıllıca kullanılması, tüm saf FPU bant genişliği avantajlarını dengeleyebilir.


2
Önbellek sorunlarının performans açısından öneminden bahsetmek için +1. Modern x86 işlemcilerde, algoritmanızı önbellek göz önünde bulundurularak tasarlamanın performans üzerinde büyük etkisi olabilir .
Jason R

5

Tek hassas şamandıraları iki katına çıkarmayı tercih edin - bu, bellek bant genişliğinizi, önbellek kapladığı alanı ve depolama gereksinimlerinizi yarıya indirecek ve bazı matematiksel işlemleri daha hızlı hale getirecektir. Ayrıca, daha fazla optimizasyon gerekirse 4 yönlü SIMD olasılığını da açar.

Sabit nokta yalnızca bir FPU'nuz olmadığında gerçekten değerlidir - çoğu modern x86 CPU'nun iki FPU'su vardır, bu nedenle sabit nokta kullanılarak elde edilecek hiçbir şey yoktur ve sabit nokta ile performans daha da kötü olabilir. (Sabit noktanın, çarpma gibi işlemler için kayan noktaya kıyasla ek talimatlar gerektirdiğini unutmayın.)


Sayısal doğruluğu artırmakla değil, azaltmakla ilgileniyorum .
nibot

52 bit hassasiyete ve büyük bir dinamik aralığa sahip olan bir çifte göre sayısal doğruluğu geliştiren sabit noktayı nasıl görüyorsunuz?
Paul R

52 bitten fazla sabit noktalı bir biçim kullanabilirdim.
nibot

Görünüşe göre sabit nokta gösteriminizin tamsayı kısmı için en az 16 bite ihtiyacınız olduğundan, bu sizi 64 bitten fazla alacaktır, bu nedenle muhtemelen CPU'nuzun yerel tamsayı talimatları bile olmayan bir biçime bakıyorsunuzdur. Bu durumda, varolan bir büyük tamsayı kütüphanesini veya benzerini de kullanabilirsiniz. Cevaplanması gereken en önemli soru şudur: Gerçekten ne kadar hassasiyete ihtiyacınız var ?
Paul R

3

Burada verilen çok iyi cevaplara ek olarak, eklemeye değer birkaç şey:

  • İşlediğiniz verilerin dinamik aralığı hakkında çok temel gereksinimleriniz olsa bile, üzerinde yapılan bazı işlemler için yine de çok iyi bir hassasiyete ihtiyaç duyacağınız durumlar vardır - örneğin, bir IIR filtresi uygulamak isteyeceksiniz. nispeten küçük katsayılar gerektirir; ve onları kesmek dengesizliklere neden olur. Sisteminiz geri bildirim alır almaz, sabit noktayı kullanırken nicelleştirme / kısaltma problemlerinin sizi geri çekmesi için iyi bir şans var - filtre topolojisi ve kesme / kesir tasarrufu gibi şeyler hakkında çok daha dikkatli olmalısınız.
  • Birçok DSP / DSC mimarisinin aksine, x86'nın doymuş tamsayı işlemleri yoktur (standart skalar kodunda değil, SSE'de vardır). Bu, taşma durumunda kötü şeylerin olabileceği anlamına gelir - değerler işaretleri değiştirir ve "sarar". Taşma ve dinamik aralık veya işlenen aralıklarında serpme testleri konusunda çok dikkatli olmalısınızkodunuzun her yerinde. Bu performansa ciddi zarar verebilir. Buna karşılık, kayan nokta bu sorunlara daha dayanıklıdır, çünkü geniş dinamik aralık size daha fazla "tavan boşluğu" sağlar ve taşmalar felaket arızalarına yol açmaz. Masaüstü bilgisayarlarda çalışan çoğu ses sinyali işleme kodu -1.0 .. 1.0 aralığı, tek veya çift kesinlik kullanır; bu yüzden yüzlerce dB'den fazla tavan boşluğu verir. Ses sinyal işleme kodunu her iki yaklaşımla da yazdım ve kayan nokta kullanırken, sinyali açıkça kırpmak / doyurmak zorunda kaldığımda sadece birkaç yer var - genellikle sinyal işleme zincirinin sonunda veya geri bildirimin gerçekleştiği yerlerde.

1

Dikkate alınması gereken bazı noktalar:

  • Modern işlemcilerin çoğu uzun yıllardır kayan nokta sayıları oluşturmayı optimize ediyor ve GPU'lar bile zaten çok başarılı bir şekilde kullanılıyor;
  • Sabit nokta hesaplamaları verilerinize zarar verir ve aritmetik işlemler iyi koşullandırılmadığında ciddi sorunlara neden olabilir (bu yüzden sabit nokta sayılarının yerini kayan nokta olanları almıştır);
  • Verilerinizi İÇERMEK için imzalı şortlar kullansanız bile (çok sayıda veri kaydedici 16 bit hassasiyet kullanır), HESAPLAMALAR kayan noktada yapılmalı, sonra tamsayılara dönüştürülmelidir, aksi takdirde nicemleme ve diğer adlandırma gibi eserler olabilir.

Son olarak, gerçek dünyadaki verilerimizin kıymetli olduğunu ve bilgisayarın kör sayı çatırtısının mütevazi bir menial çalışma olduğunu düşünüyorum. Bilgisayar, verileriniz ve sizin için ağır kaldırma işini yapmalı ve şovdaki gerçek yıldızmış gibi davranılmamalıdır.


Miktarlarımı içermek için 16 bitlik şort kullanacağımı ima etmek istemedim, aksine 16 bitlik tamsayı kısmı ve 48 bitlik kesirli kısmı olan 64 bitlik sabit nokta formatı gibi bir şey. Motivasyon şudur ki, üssü bitlerin çoğunu yine de kayan nokta biçiminde kullanmıyorsam, bunun yerine ek anlamlı basamaklar sağlamak için bu bitleri kullanırsam sayısal doğruluğum iyileşir mi?
nibot

Orijinal soruya 16 bit tam sayı + 48 bit kesirli eklemeniz gerekir. Gibi görünüyor215karışıklığa neden oluyor.
Christopher Felton

Bir şey daha var: Bana göre StackOverflow (burada DSP.SE yerine), bir formatın artıları ve eksileri hakkında diğerine göre daha derin nedenler elde etmek için ideal bir yer olacaktır.
Ekim'de heltonbiker
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.