2009-08-18 14 views
6

Funkcje matematyczne frameworka .NET obsługują głównie przepływy o podwójnej precyzji, nie występują przeciążenia pojedynczej precyzji (zmiennoprzecinkowe). Podczas pracy z danymi o pojedynczej dokładności w scenariuszu wysokiej wydajności powoduje to niepotrzebne rzutowanie, a także obliczanie funkcji z większą precyzją niż jest to wymagane, w związku z czym w pewnym stopniu wpływa to na wydajność.Operacje matematyczne z jedną precyzją w .NET?

Czy istnieje sposób na uniknięcie niektórych dodatkowych kosztów procesora? Na przykład. czy istnieje biblioteka matematyczna open source z przeciążeniami pływaka, która bezpośrednio wywołuje instrukcje FPU? (Rozumiem, że wymagałoby to wsparcia w CLR). I właściwie nie jestem pewien, czy współczesne procesory mają nawet pojedyncze instrukcje precyzji.

Kwestia ta została częściowo zainspirowana to pytanie na temat optymalizacji funkcji esicy:

Math optimization in C#

Odpowiedz

3

O ile mi wiadomo, .NET Framework nie zawiera API z bezpośrednim dostępem do intrinsics matematycznych. Biblioteki Mono obsługują wsparcie dla właściwości wewnętrznych, ale nie jestem pewien ich stanu.

[Edit. Ten paragraf jest komentarzem, dlaczego nie widać przeciążeń dla float parametrów] Jednym problemem jest stos ocena CLI (za ECMA-335) nie wprowadza rozróżnienia między float i double typów. Ważna implementacja może traktować wszystko, co jako dla operacji matematycznych, ale wyobrażam sobie, że CLR (implementacja CLI przez Microsoft) wykonuje optymalizacje dla arytmetycznej pojedynczej precyzji tam, gdzie to możliwe.

Myślę, że to trochę niefortunne, że zagadnienie samoistności (w szczególności rozszerzeń SIMD) nie zostało jeszcze rozwiązane [w opublikowanym produkcie]. Według mnie outsider's-poparcie jest wsparciem dla inności, wymagałoby znaczących zmian w maszynie wirtualnej, które stanowią niedopuszczalne ryzyko w tym momencie cyklu wydawniczego .NET Framework. Śmieciarz (i myślę, że mechanizmy obsługi wyjątków) jest ściśle powiązany z alokatorem rejestru, a obsługa intrinsics dodaje do tej dziedziny radykalnie nową zmienną.

+0

Kiedy odnosić się do instrinsics jest taki sam jak funkcje zewnętrzne? - w jaki sposób implementowane są funkcje matematyczne, a wewnętrzne definiowane w języku. AFAIK CLR można łatwo rozszerzyć, aby wprowadzić np. public static extern double Sin (float a) oprócz wersji podwójnej precyzji. – redcalx

+1

Czy mówisz o implementacji w natywnym kodzie? Pośrednie wywołanie P/Invoke dla pojedynczej operacji zmiennoprzecinkowej całkowicie zanegowałoby próbę uniknięcia wpływu wydajności na działanie z 'Sin (double)'. Nazwy wewnętrzne są deklarowane jako "zewnętrzne", ale nie są P/Wywoływanie - kod macierzysty dla nich jest wewnętrznie obsługiwany przez samą JIT, aby były tak wydajne, jak to tylko możliwe. –

+0

Może więc można uzyskać pewną wydajność, jeśli twój algorytm był taki, że można wykonać pojedyncze P/Invoke, które wykonuje wiele operacji swobodnych. – Fantius

1

Tak, tworzymy zaawansowaną bibliotekę matematyczną skalowania do przodu, która natywnie wykorzystuje obliczenia zmiennoprzecinkowe z jedną precyzją, jeśli to wszystko, czego potrzebujesz. I masz rację, jeśli poprawnie zaimplementowane, mogą być znacznie szybsze niż przy użyciu podwójnej precyzji.

Sprawdź bibliotekę matematyczną od oprogramowania CenterSpace.

Paul

+1

Więc ta biblioteka prawdopodobnie odwołuje się do niezarządzanego kodu? – redcalx

+1

Tak, zgadza się. – Paul