2016-07-24 3 views
3

C++ではなくC#でビデオ処理ライブラリを作成することを検討しています。 C++には、生のビデオフレームバッファ上のポインタを操作する利点があります。 C#では代わりにそのバッファにMemoryStreamがあり、前後に探索できます。C#での未処理メモリストリームのパフォーマンス

各ピクセルに1つずつ数式を適用する必要があります。 C++でのアセンブリ最適化を使用する場合は、8 x 8または16 x 16です。

これをC#で行う方法は、C++で行う方法とSSE2アセンブリで行う方法と比べてどうでしょうか?

C#が、それはオンザフライ最終コンパイルを行いますので、それは、そのようなAVXおよびAVX2など、すべてのCPU固有の命令を使用することができ、そしてどれだけそれをするのかという利点を持っていますか?

このようなタスクでC#のパフォーマンスを最大限に引き出すためのベストプラクティスはありますか?

カーソルをMemoryStream内に移動すると、ポインタと比較して構文が複雑になります。これを単純化する方法はありますか?

編集:ここと他の場所のコメントに基づいて、2つのオプションがあるようです。

  1. System.Numerics.Vectors
    https://msdn.microsoft.com/en-us/library/dn879696(v=vs.110).aspx#Anchor_4

  2. numpyのscipyのダウンロードとはPythonで、このような作業のために人気のオプションであり、.NET
    https://www.infoq.com/news/2011/07/NumPy-NET

どれに移植されていますこれらの2つの選択肢の賛否両論と限界についてのアイデア? System.Numerics.Vectorsはx64のみで動作しますか? SciPyはSIMD最適化を使用していますか?

C++ SIMDに近い性能が同じ関数(C++、SSE2、AVX)のいくつかのバージョンを記述することなく、C#で得ることができる場合、これは大きな利点を有するであろう。そうでなければそれを使用しない場所でのSIMD最適化が可能になります。

EDIT2:System.Numerics.Vectorsが移動するための方法であるので、どこにも私は、numpyのscipyのダウンロードとサポートSIMD最適化することを読み込むことはできません。

+0

C#は '安全でない 'コンテキストでもポインタをサポートしますが、SSEのサポートが不足しているためC++よりパフォーマンスが悪いです。 – Dai

+0

何でも可能ですが、長年にわたって非常に慎重に手作業でチューニングされた既存のコーデック実装と競合しています。年を取ることができる場合にのみ、これを行うことを検討してください。 –

+0

これは、.NETを使用したAviSynthプラグインの開発用です。このようなプラグインを開発しているプログラマーのコミュニティ全体があります。主にC++およびアセンブリで使用されます。 http://forum.doom9.org/showthread.php?t=144663 –

答えて

2

SIMD命令はa few data typesでのみサポートされていますが、タイプは.NET 4.6に付属しています。または、System.Numerics.Vectors NuGetパッケージを使用して.NET 4.5で入手できます。

SSE2アセンブリまたはSIMD C++コードの作成経験がある方は、パフォーマンスが向上していて、経験が豊富であればそれに従うべきです。

+0

私はSIMDプログラミングに関する経験はありません。私はC++のコードを書いて、他の誰かがその部分を追加しなければなりませんでした。彼はまた、16ビット浮動小数点からのAVX変換にも組み込み関数を使用していましたが、AVXサポートでコンパイルされたアセンブリはAVX対応CPUでしか動作せず、x86、x64、x86-AVX、x64 -AVX。 –

+0

"管理対象コード用の新しい64ビットJITコンパイラで64ビットアプリケーションをコンパイルする必要があります。" SIMDはx86コンパイルでは使用されませんか? –

+0

私は正直に分かりません。私は個人的にSystem.Numerics.Vectorsを使用したことはありません –