2009-08-18 27 views
6

.NET çerçevesinin Matematik işlevleri çoğunlukla çift duyarlıklı şamandıralarda çalışır, tek bir hassasiyet (şamandıra) aşırı yüklenme yoktur. Yüksek performans senaryosunda tekli hassas verilerle çalışırken, bu durum gereksiz dökümlere ve ayrıca işlevlerin gerekenden daha hassas bir şekilde hesaplanmasına neden olur, dolayısıyla performans bir dereceye kadar etkilenir. Bu ek CPU yükü bazı kaçınmanın bir yoluTek Hassas Matematik Operasyonları?

var mı? Örneğin. Altta yatan FPU yönergelerini doğrudan çağıran şamandıralı aşırı yüklü açık kaynak matematik kütüphanesi var mı? (Benim anlayışım, bunun CLR'de destek gerektirmesidir). Ve aslında modern CPU'ların bile tek bir hassas talimatı olup olmadığından emin değilim.

Bu soru kısmen sigmoid fonksiyonunu optimize etme konusunda bu soruya ilham almıştır:

Bildiğim kadarıyla

Math optimization in C#

cevap

3

, .NET Framework matematik intrinsics doğrudan erişimi olan bir API içermez. Mono kütüphaneleri intrinsik için çalışma desteği içerir, ancak onların durumundan emin değilim.

[Düzenleme:. Bu paragraf size float parametreler için aşırı yüklenmeleri görmüyorum neden yorumdur] Bir bela float ve double türleri arasında ayrım yapmaz (ECMA-335 başına) CLI değerlendirme yığını olduğunu. Geçerli bir uygulama matematik işlemleri için bir double olarak herşeyi tedavi olabilir, ama nerede can CLR (CLI Microsoft'un uygulama) tek duyarlıklı aritmetik için optimizasyonlar gerçekleştirir düşünün.

Ben (özellikle SIMD uzantılarında) intrinsics sorununun henüz [piyasaya ürün] ele edilmediğini biraz talihsiz olduğunu düşünüyorum. Benim dış görevimin tahmin ettiği şey, içsel destek için VM'nin bu noktada .NET Framework sürüm döngüsünde kabul edilemez riskler oluşturan önemli değişiklikler gerektirmesidir. Çöp toplayıcı (ve bence istisna taşıma mekanizmaları) kayıt ayırıcısı ile sıkı sıkıya bağlıdır ve destekleyici içseller bu alana radikal yeni bir değişken katmaktadır.

+0

Eğer instrinsics bakın bu harici fonksiyonları aynıdır? - Matematik fonksiyonlarının nasıl uygulandığı, yani dilde tanımlanan intrinsiktir. AFAIK CLR, örn. Çift statik versiyonuna ek olarak, halka açık statik extern çift Sin (float a). – redcalx

+1

Yerel kodda uygulamaktan mı bahsediyorsunuz? Tek bir kayan nokta işlemi için yapılan P/Invoke ek yükü, Sin (çift) ile çalışmanın performans etkisinden kaçınmaya çalışmayı tamamen ortadan kaldıracaktır. Intrinsics 'extern' olarak bildirilir, fakat P/Invoke değildir - bunlar için yerel kod, JIT tarafından dahili olarak mümkün olduğunca verimli hale getirilir. –

+0

Bu yüzden, eğer algoritmanız çok sayıda float işlemi yapan tek bir P/Invoke yapabileceğiniz şekildeyse, bazı performanslar elde edilebilir. – Fantius

1

Evet, bunun tek ihtiyacınız varsa doğal olarak nokta hesaplamaları kayan tek hassasiyet kullanan bir yüksek performanslı ileri ölçekleme matematik kütüphanesini oluşturmak. Doğru, doğru uygulandığında, çift duyarlıktan çok daha hızlı olabilirsiniz. CenterSpace Software dan

Kontrol dışarı this matematik kütüphanesi.

Paul

+1

Yani bu kütüphane yönetilmeyen kod çağrılıyor mu? – redcalx

+1

Evet, bu doğru. – Paul