Sert ve yumuşak kayan nokta sayıları arasındaki fark nedir?


99

C kodunu çapraz araç zincirimle derlediğimde, bağlayıcı, çalıştırılabilir dosyamın sabit kayan değerler kullandığını, ancak libc'min yumuşak kaymalar kullandığını söyleyen uyarı sayfaları yazdırır. Fark ne?


ARM mimarisi ise, lütfen bunu etiketlere ekleyin :-)
Nils Pipenbrinck

3
@Nils Pipenbrinck: MIPS çiplerinde de bu sorun var
Javier

Yanıtlar:


101

Sert yüzer bir çip üzerinde kayan nokta birimi kullanır. Yumuşak yüzer, yazılımdaki birini taklit eder. Aradaki fark hızdır. Her ikisinin de aynı hedef mimaride kullanıldığını görmek garip çünkü çipin bir FPU'su var ya da yok. -Msoft-float ile GCC'de yumuşak kayan noktayı etkinleştirebilirsiniz. Eğer kullanıyorsanız, donanım kayan noktasını kullanmak için libc'nizi yeniden derlemek isteyebilirsiniz.


3
"Her ikisinin de aynı hedef mimaride kullanıldığını görmek garip" Bu, bir kitaplığın doğruluk açısından kritik parçalarda makineden bağımsız ve bit-tam (soft float) ve küçük sapmaların yetersiz kaldığı parçalarda hızlı (hard float) olması mantıklı olabilir. önemli değil.
PhilLab

32 bitlik ARM'de gerçekleşir.
Aaron Franke

31

Kayan nokta aritmetiği yapmanın üç yolu vardır:

  • CPU'nuzda FPU varsa float komutlarını kullanın. (hızlı)
  • Derleyicinizin kayan nokta aritmetiğini tam sayı aritmetiğine çevirmesini sağlayın. (yavaş)
  • Float komutları ve FPU'su olmayan bir CPU kullanın. CPU'nuz bir istisna oluşturacaktır (Ayrılmış Talimat, Uygulanmamış Talimat veya benzeri) ve işletim sistemi çekirdeğiniz bir kayan nokta öykünücüsü içeriyorsa, bu talimatları (en yavaş) taklit edecektir.

23

Açıkçası, tüm bu cevaplar bana yanlış geliyor.

C kodunu çapraz araç zincirimle derlediğimde, bağlayıcı, çalıştırılabilir dosyamın sabit kayan değerler kullandığını, ancak libc'min yumuşak kaymalar kullandığını söyleyen uyarı sayfaları yazdırır. Fark ne?

Debian wiki VFP için üç seçenek dair bilgi -mfloat-abi,

  • soft - bu saf bir yazılımdır
  • softfp- bu bir donanım FPU'sunu destekler, ancak ABI yazılımla uyumludur.
  • hard- ABI kayan veya VFP kayıtları kullanır .

Bağlayıcı (yükleyici) hatası, kayan nokta değerlerini tamsayı yazmaçlarında geçirecek bir paylaşılan kitaplığınızın olmasıdır. Hala kodunuzu a -mfpu=vfp, vb -mfloat-abi=softfp. İle derleyebilirsiniz , ancak kullanmalısınız, böylece libc bir float'a ihtiyaç duyarsa, kütüphanenin anlayacağı şekilde iletilir.

Linux çekirdeği, VFP talimatlarının öykünmesini destekleyebilir. Açıkçası, -mfpu=nonebu durum için derlemeniz ve herhangi bir Linux çekirdek öykünmesine güvenmek yerine derlemenin doğrudan kod üretmesini sağlamanız daha iyi . Ancak, OP'nin hatasının aslında bu konuyla ilgili olduğuna inanmıyorum. Ayrıdır ve ayrıca ile birlikte ele alınmalıdır -mfloat-abi.

Armv5 CPU ile paylaşılan Armv5 kütüphanesi bunun tam tersidir; libc sert şamandıra oldu ama uygulama yalnızca idi yumuşak . Sorunu aşmanın bazı yolları vardır, ancak doğru seçeneklerle yeniden derlemek her zaman en kolayıdır.

Diğer bir sorun da, Linux çekirdeğinin, bir bağlam anahtarındaki kayıtları kaydetmek / geri yüklemek için VFP görevlerini (veya mevcut ARM kayan noktasını) desteklemesi gerektiğidir.


1
Modern GCC (~ 4.8 +) sürümleri, hard float ve soft float kitaplıklarına sahip olan 'multi-lib'i destekler. Önceki sürümler, belirli bir sürümle oluşturulmuş bir derleyiciye sahip olmanızı gerektiriyordu. Bir 'multi-lib' gcc dağıtımına bağlanırken bazen doğru kitaplığa giden yol gereklidir, çünkü kitaplıkların birkaç sürümü vardır (derleyiciyi oluşturmak için daha uzun bir süre gerekir). Dizin adları 'hf', 'hardf', 'libhf' veya 'hard-float' olabilir, ancak bunlar genellikle normal 'soft' dizininin veya yakındaki bir konumun altındadır.
artless noise

Bu doğru cevap. Floats için çağıran dönüşüm, kodunuz ve libc arasında eşleşmelidir. Asla herhangi bir kayan noktalı libc işlevini çağırmazsanız, yine de bir uyumsuzlukla çalışabilir.
Tor Klingberg

13

Görünüşe göre libc'niz yazılım kayan nokta işlemleri için oluşturulmuş gibi görünürken, exe'niz kayan nokta için donanım desteği varsayılarak derlenmiştir. Kısa vadede, yumuşak yüzerleri bir derleyici bayrağı olarak zorlayabilirsiniz. (gcc kullanıyorsanız, bunun -msoft-float olduğunu düşünüyorum)

Daha uzun vadede, hedefinizin işlemcisi kayan nokta işlemleri için donanım desteğine sahipse, genellikle hız için donanım kayması etkinleştirilmiş bir çapraz araç zinciri oluşturmak veya bulmak istersiniz. Bazı işlemci ailelerinin, bazıları donanım desteği olan ve bazıları olmayan model varyantları vardır. Bu nedenle, örneğin, sadece işlemcinizin bir ARM olduğunu söylemek, donanım kayan nokta desteğiniz olup olmadığını bilmek için yetersizdir.


8

Hesaplama, kayan nokta donanımı ile veya tamsayı aritmetiğine dayalı yazılımla yapılabilir.

Bunu donanımda yapmak çok daha hızlıdır, ancak çoğu mikro denetleyicinin kayan nokta donanımı yoktur. Bu durumda, kayan noktayı kullanmaktan kaçınabilirsiniz (genellikle en iyi seçenek) veya C kütüphanesinin bir parçası olacak yazılımdaki bir uygulamaya güvenebilirsiniz.

Bazı denetleyici ailelerinde, örneğin ARM, kayan nokta donanımı ailenin bazı modellerinde bulunur, ancak diğerlerinde yoktur, bu nedenle bu aileler için gcc her ikisini de destekler. Görünüşe göre sorunun, iki seçeneği karıştırmışsın.

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.