2016-01-20 16 views
14

Sto eseguendo un codice C# che utilizza System.Numerics.Vector<T> ma, per quanto posso dire, non sto ottenendo il massimo vantaggio dalle intrinseche SIMD. Uso Visual Studio Community 2015 con Update 1 e my clrjit.dll è v4.6.1063.1.RyuJIT non utilizza completamente le intrinseche SIMD

Sono in esecuzione su un Intel Core i5-3337U Processor, che implementa le estensioni del set di istruzioni AVX. Pertanto, immagino, dovrei essere in grado di eseguire la maggior parte delle istruzioni SIMD su un registro a 256 bit. Ad esempio, lo smontaggio dovrebbe contenere istruzioni come vmovups, vmovupd, vaddups, ecc., E Vector<float>.Count dovrebbe restituire 8, Vector<double>.Count dovrebbe essere 4, ecc ... Ma non è quello che sto vedendo.

Invece il mio smontaggio contiene istruzioni come movups, movupd, addups, ecc ... e il seguente codice:

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"); 

produce:

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

Dove sto andando male? Per vedere tutte le impostazioni del progetto ecc. Il progetto è disponibile here.

+1

RyuJIT è open source su GitHub in modo da poter controllare il suo codice e discutere direttamente con gli sviluppatori. –

risposta

11

Il tuo processore è un po 'datato, la sua micro-architettura è Ivy Bridge. Il "tock" di Sandy Bridge, una funzionalità che si restringe senza modifiche architettoniche. La vostra nemesi è questo pezzo di codice RyuJIT, located in ee_il_dll.cpp, CILJit :: getMaxIntrinsicSIMDVectorLength() funzione:

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; 
    } 
} 

Nota l'uso di CORJIT_FLG_USE_AVX2. Il tuo processore non supporta ancora AVX2, quell'estensione divenne disponibile in Haswell. La prossima micro-architettura dopo Ivy Bridge, un "segno di spunta". Molto bello processore btw, scoperte come this one hanno un grande fattore wow.

Nulla che tu possa fare per questo, ma fare shopping. Per ispirazione, puoi guardare il tipo di codice che genera in this post.

+0

Può anche provare a implementare il supporto AVX e inviare una patch. Non che questa sia un'opzione realistica. O aprire un biglietto lì - forse l'uso di AVX2 non era del tutto intenzionale? Ma in generale - sì. Lo shopping è l'opzione migliore. – TomTom