SORU
28 Kasım 2012, ÇARŞAMBA


Hesaplama Karekök(x) x * olarak İnvSqrt(x) Doom 3 ATI kodu mantıklı geliyor mu?

Hiç mantıklı görünmüyor son zamanlarda yayımlanan bir şey üzerine geldiğimde Doom 3 BFG source code, göz. Doom 3 idMath sınıfta matematik fonksiyonları tamamladı. Bazı fonksiyonlar sadece ileri sarma için ilgili fonksiyonları math.h ama bazıları reimplementations (örneğin idMath::exp16()) bu sanırım bir daha yüksek performans daha kendi math.h karşılıkları (belki karşılığında hassas).

Benim kafamı karıştıran şey, ancak, float idMath::Sqrt(float x) işlevi uygulanan zorundalar bir şekilde

ID_INLINE float idMath::InvSqrt( float x ) {
     return ( x > FLT_SMALLEST_NON_DENORMAL ) ? sqrtf( 1.0f / x ) : INFINITY;
}

ID_INLINE float idMath::Sqrt( float x ) {
     return ( x >= 0.0f ) ? x * InvSqrt( x ) : 0.0f;
}

Bu iki gereksiz kayan nokta işlemleri gerçekleştirmek için ortaya çıkıyor: İlk bölme ve çarpma.

İlginç original Doom 3 source code ayrıca bu şekilde Karekök fonksiyonu uygulanan unutmayın, ama ters Kare Kök fast inverse square root algorithm kullanır.

ID_INLINE float idMath::InvSqrt( float x ) {

    dword a = ((union _flint*)(&x))->i;
    union _flint seed;

    assert( initialized );

    double y = x * 0.5f;
    seed.i = (( ( (3*EXP_BIAS-1) - ( (a >> EXP_POS) & 0xFF) ) >> 1)<<EXP_POS) | iSqrt[(a >> (EXP_POS-LOOKUP_BITS)) & LOOKUP_MASK];
    double r = seed.f;
    r = r * ( 1.5f - r * r * y );
    r = r * ( 1.5f - r * r * y );
    return (float) r;
}


ID_INLINE float idMath::Sqrt( float x ) {
    return x * InvSqrt( x );
}

Eğer InvSqrt(x) DAHİLİ olarak sadece math.hderse x * InvSqrt(x) Sqrt(x) hesaplama's fsqrt(1.f/x)? hiçbir faydasını görüyor musun Belki eksik bir şey normal dışı kayan nokta sayıları hakkında önemli burada yoksa sadece ıd yazılım parçası ıslaklık mıyım?

CEVAP
28 Kasım 2012, ÇARŞAMBA


Görüyorum iki nedenden dolayı yapıyor böyle: birincisi, "hızlı invSqrt" yöntemi (Newton Raphson) şimdi kullanılan yöntem bir çok donanım, o yüzden bu yaklaşım açık bırakır olasılığı üzerinde çalışıyorum bu tür donanım (ve ne potansiyel olarak dört ya da daha fazla bu tür operasyonlar aynı anda). Bu makale biraz anlatılır:

How slow (how many cycles) is calculating a square root?

İkinci neden uyumluluk için. Eğer hesaplama Karekök için kod yolu değiştirirseniz, farklı sonuçlar (özellikle sıfır, NaNs, vb.) alabilirsiniz, ve eski düzene bağlı olduğunu kod ile uyumluluk kaybedersiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chilla Frilla™

    Chilla Frill

    7 Aralık 2006
  • Semantic Mastery

    Semantic Mas

    30 EKİM 2013
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012