2012-05-27 14 views

Odpowiedz

10

Nie, nie ma scenariusza w .NET gdzie można napisać kod maszynowy samodzielnie. Generowanie kodu zależy wyłącznie od kompilatora just-in-time. Z pewnością jest w stanie dostosować generowanie kodu w oparciu o możliwości procesora komputera. Jednym z głównych powodów, dla których ngen.exe zawsze musi być uruchamiany na maszynie docelowej. Niezależnie od tego, czy wahania w .NET 4.5 zostały zmodyfikowane, aby skorzystać z sse4 lub avx, to pytanie otwarte, nic o tym nie słyszałem. Wątpię w to, że Microsoft nie majstruje z wieloma problemami, poza naprawianiem błędów. Bardzo destabilizujący i 4,5 nie jest wersją side-by-side.

VS-11 ma jednak zaktualizowany generator kodu dla C++. Jest zdolny do automatycznej pętli do wektoryzacji i używa do tego instrukcji SIMD/AVX. Wspomina o tym blog post, krótkie wideo to available here.


Aktualizacja: new x64 jitter, obecnie w CTP i kryptonimie RyuJIT, zawiera pewne szczątkowe wsparcie dla instrukcji SIMD. Typ SSE2, zapewniający automatyczną wektoryzację. Jest jednak mocno zamknięty w pakiecie Microsoft.Bcl.Simd i klasach Vector <>, nie ma uniwersalnego rozwiązania dla 16-bajtowego wymogu wyrównania pamięci, że SIMD musi działać szybko.

Najprawdopodobniej owocna ścieżka naprzód to .NET Native, ogłoszona na ostatniej konferencji Build. Wykorzystuje back-end kompilatora C++ do generowania kodu z wyprzedzeniem, automatycznie korzystając z wbudowanej obsługi automatycznej wektoryzacji i automatycznej równoległości. W przeciwnym razie bez jasnego wyjaśnienia, jak rozwiązano problem wyrównania pamięci. Ma własne problemy, Refleksja jest trudna i jest obecnie obsługiwana tylko w aplikacjach pakowanych, takich, z których zależności czasu wykonywania można określić z wyprzedzeniem. Aplikacje Windows Store i Phone.


Aktualizacja: ten dostarczany w .NET 4.6, montaż System.Numerics.Vectors.dll. Pamiętaj, że ta dołączona do frameworka jest "bezpieczna" i nie pasuje do dokumentacji MSDN, brakuje jej Vector<T>. Pakiet Nuget (wersja 4.1.0) jest zgodny.

+0

Dzięki za odpowiedź –

+2

Z pewnością możesz sam napisać kod maszynowy; zapisz bajty do pamięci, a następnie zadzwoń do 'Marshal.GetDelegateForFunctionPointer', aby uzyskać delegata, do którego możesz zadzwonić. Koszt wywołania tego będzie oznaczać, że prawdopodobnie nie będzie porównywać się z Mono.Simd, ale jest to z pewnością możliwe. –

+0

https://en.wikipedia.org/wiki/NX_bit –

Powiązane problemy