2016-01-20 53 views
14

Używam kodu C#, który używa System.Numerics.Vector<T>, ale o ile mogę powiedzieć, nie dostaję pełnych korzyści z wewnętrznych właściwości SIMD. Korzystam z programu Visual Studio Community 2015 z aktualizacją 1, a mój plik clrjit.dll to v4.6.1063.1.RyuJIT nie w pełni wykorzystuję wewnętrzną charakterystykę SIMD

Używam wersji Intel Core i5-3337U Processor, która implementuje rozszerzenia zestawu instrukcji AVX. Dlatego uważam, że powinienem móc wykonać większość instrukcji SIMD w rejestrze 256-bitowym. Na przykład demontaż powinien zawierać instrukcje, takie jak vmovups, vmovupd, , itp., A Vector<float>.Count powinien powrócić 8, Vector<double>.Count powinien być 4, itd ... Ale to nie jest to, co widzę.

Zamiast mój demontaż zawiera instrukcje jak movups, movupd, addups, itp ... i następującego kodu:

WriteLine($"{Vector<byte>.Count} bytes per operation"); 
WriteLine($"{Vector<float>.Count} floats per operation"); 
WriteLine($"{Vector<int>.Count} ints per operation"); 
WriteLine($"{Vector<double>.Count} doubles per operation"); 

produkuje:

16 bytes per operation 
4 floats per operation 
4 ints per operation 
2 doubles per operation 

Gdzie jestem będzie niewłaściwy? Aby zobaczyć wszystkie ustawienia projektu itp. Projekt jest dostępny here.

+1

RyuJIT jest open source na GitHub, więc możesz sprawdzić jego kod i porozmawiać bezpośrednio z programistami. –

Odpowiedz

11

Twój procesor jest nieco przestarzały, jego mikro-architektura to Ivy Bridge. "Tock" Sandy Bridge, cecha kurcząca się bez zmian architektonicznych. Twój wróg jest ten kawałek kodu w RyuJIT, located in ee_il_dll.cpp, CILJit :: getMaxIntrinsicSIMDVectorLength() funkcja:

if (((cpuCompileFlags & CORJIT_FLG_PREJIT) == 0) && 
    ((cpuCompileFlags & CORJIT_FLG_FEATURE_SIMD) != 0) && 
    ((cpuCompileFlags & CORJIT_FLG_USE_AVX2) != 0)) 
{ 
    static ConfigDWORD fEnableAVX; 
    if (fEnableAVX.val(CLRConfig::EXTERNAL_EnableAVX) != 0) 
    { 
     return 32; 
    } 
} 

Uwaga wykorzystanie CORJIT_FLG_USE_AVX2. Twój procesor nie obsługuje jeszcze AVX2, rozszerzenie to stało się dostępne w Haswell. Kolejna mikro architektura po Ivy Bridge, "tick". Bardzo ładny procesor, odkrycia takie jak this one mają duży wpływ na jakość.

Nic nie możesz zrobić, ale idź na zakupy. Aby uzyskać inspirację, możesz przyjrzeć się rodzajowi kodu generowanemu w this post.

+0

Potrafi także spróbować zaimplementować obsługę AVX i przesłać poprawkę. Nie to jest realistyczna opcja. Lub otwórz tam bilet - może korzystanie z AVX2 nie było całkowicie zamierzone? Ale ogólnie - tak. Zakupy to najlepsza opcja. – TomTom