2016-01-20 9 views
14

System.Numerics.Vector<T>を使用するC#コードを実行していますが、SIMD組み込み関数の利点をすべて得ることはできません。私はUpdate 1でVisual Studio Community 2015を使用していますが、私のclrjit.dllはv4.6.1063.1です。RyuJITはSIMD組み込み関数を完全に使用していません

AVX命令セット拡張機能を実装しているIntel Core i5-3337U Processorで動作しています。したがって、私は256ビットレジスタでほとんどのSIMD命令を実行できるはずです。たとえば、逆アセンブリにはvmovupsvmovupdvaddupsなどの指示が含まれ、Vector<float>.Countは8を返す必要があります。Vector<double>.Countは4などになるはずですが、それは私が見ているものではありません。

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

が生成されます:

は、代わりに私の解体がmovupsmovupdaddups、等...そして次のコードのような手順が含まれてい

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

はどこで間違ったんですか?すべてのプロジェクト設定などを表示するには、hereプロジェクトが利用可能です。

+1

RyuJITはGitHubのオープンソースなので、コードを確認して開発者と直接話し合うことができます。 –

答えて

11

プロセッサの日付はちょっと古いですが、マイクロアーキテクチャはIvy Bridgeです。 Sandy Bridgeの "tock"は、アーキテクチャの変更なしに縮小されています。あなたの宿敵は、このコードのビットは、RyuJITであるlocated in ee_il_dll.cpp、CILJit :: getMaxIntrinsicSIMDVectorLength()関数:

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

注CORJIT_FLG_USE_AVX2の使用。お使いのプロセッサはまだAVX2をサポートしておらず、その拡張機能はHaswellで利用できるようになりました。 Ivy Bridgeの後の次のマイクロアーキテクチャ、「ダニ」。非常に素晴らしいプロセッサーbtw、this oneのような発見は大きな驚きの要因があります。

これについては何もできませんが、買い物に行くことはありません。インスピレーションのためには、生成するコードの種類をthis postで調べることができます。

+0

彼は実際にAVXサポートを実装してパッチを提出しようとすることもできます。現実的な選択肢ではありません。またはチケットを開いてください。おそらくAVX2の使用は完全に意図的ではありませんでしたか?しかし、一般的にはそうです。ショッピングは最高の選択肢です。 – TomTom

関連する問題