C# コードの最適化に関する質問を読んでいましたが、1 つの解決策は SSE で C++ を使用することでした。ac# プログラムから直接 SSE を実行することは可能ですか?
10 に答える
今後のMono 2.2 リリースでは、SIMD がサポートされる予定です。Miguel de Icaza は、今後の機能についてここでブログを書いており、API はここにあります。
Microsoft の .NET Windows ランタイムでの開発をサポートするライブラリがありますが、Mono ランタイムでコードを実行しない限り、求めているパフォーマンス上の利点は得られません。状況によっては実行可能な場合があります。
更新: Mono 2.2 がリリースされました
C# は明示的に SSE 呼び出しを行うことができますか?
いいえ。C# はインライン IL を生成できず、インライン x86/amd64 アセンブリも生成できません。
CLR、より具体的には JIT は、利用可能な場合は SSE を使用し、ほとんどの状況で強制する必要がなくなります。私は SSE の専門家ではなく、それが有益であり、JIT が最適化を行わない場合があると確信しているので、私はほとんどと言います。
.NET 用の SIMDは、近い将来利用可能になる予定です。この機能には、 RyuJIT (.NET 用の次世代 JIT コンパイラ) が必要です。
この機能を利用するには、 Microsoft.Bcl.Simd パッケージMicrosoft.Numerics.Vectors.Vector<T>
のクラスを使用する必要があります。サンプルコードはこちら。
このフォーラムへの投稿に基づいて、ターゲット マシンで SSE が利用可能な場合、MS JIT コンパイラは自動的に SSE を使用します。
実行したい作業の「チャンク」がある場合、最善の策は、MMX/SSE 組み込み関数を使用して C++ で記述し、機能をラップしてそれを.net クラス。その後、コードはそのアセンブリを通常のクラスのように使用できます。
VC 組み込み関数の詳細については、私が何年も前に書いたこの小さな記事を参照してください。
http://msdn.microsoft.com/en-us/library/0aws1s9k.aspx
ああ、実際に並列関数を使用して何かを高速化したいと思っていると思います。他の人が指摘しているように、データをより大きなチャンクなどで移動したいだけの場合、JITはそれらの基本にSSEを使用する方法をすでに知っています。
最近、Microsoft は C# 用のベータ SIMD ベクトル ライブラリ ( Microsoft.Bcl.Simd ) をリリースしました。これには RyuJIT CTP のインストールが必要で、Windows 8 のみで動作します。
ネイティブ SSE ライブラリを使用して、C# から呼び出すこともできます。たとえば、Yeppp ライブラリについては、この StackOverflow answerを参照してください。
確かにできます (より重要な質問は、なぜそうするのかということです。それはランタイムに任せてください。それがその仕事です)。
C# では、デリゲートをメモリ アドレスにマップできます。そのメモリ アドレスには、生のアセンブリ コードを含めることができます。詳細については、Michael Giagnocavo のブログを参照してください。
私自身は試していませんが、 Marshal.GetDelegateForFunctionPointerも使用できる可能性があります。