SORU
16 EKİM 2012, Salı


Neden yok't üstel bir artış içine derleyici optimize etmek için bir kayan nokta *2?

Genellikle yürütülebilir vardiya halinde gcc dönüştürme çarpımları fark ettim. Benzer bir çarpma ne zaman int float. Örneğin, 2 * f, sadece 1, bazı devir tasarruf artırmak f üs olabilir. Bu derleyici, bir istekleri belki de onları bu yüzden (-ffast-math) gibi), genel olarak, bunu yapmak?

Derleyiciler genellikle yapacak kadar zeki bu, ya da bunu yapmak için gereken scalb*() ldexp()/frexp() fonksiyon aileyi kendim kullanıyor muyum?

CEVAP
16 EKİM 2012, Salı


Örnek, 2 * f, sadece 1 f üs artış olabilir, bazı devir tasarruf.

Bu kesinlikle doğru değil.

İlk sıfır, sonsuzluk, Nan, ve denormals gibi çok köşeli durumlar var. Sonra performans sorunu var.

Yanlış anlama üs artan bir çarpma yaparak daha hızlı değildir.

Eğer donanım talimatları bakarsanız, artırmak için doğrudan bir yol üs yok. Bunun yerine yapmanız gereken budur:

  1. Bit tamsayı dönüştürmek.
  2. Artım üs.
  3. Ina geri kayan nokta dönüştürmek.

Genellikle tamsayı ve kayan nokta yürütme birimleri arasında veri taşımak için büyük gecikme için bir araç var. Yani sonunda, "optimizasyon" basit bir kayan nokta çarpma. çok daha kötü olur bu

Derleyici yapmaz neden bu kadar nedeni bu "iyileştirme" değil, çünkü daha hızlı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • Electro Posé

    Electro Pos

    21 ŞUBAT 2013
  • The Slow Mo Guys

    The Slow Mo

    15 AĞUSTOS 2010