質問
C# コードの最適化に関する質問を読んでいたところ、解決策の 1 つは SSE で C++ を使用することでした。C# プログラムから直接 SSE を実行することは可能ですか?
解決
今後の Mono 2.2リリースでは、SIMDがサポートされる予定です。 Miguel de Icazaは、今後の機能こちらについてブログに書いており、APIは< a href = "http://go-mono.com/docs/index.aspx?tlink=0@N%3aMono.Simd" rel = "noreferrer">こちら。
Microsoftの.NET Windowsランタイムでの開発をサポートするライブラリがありますが、Monoランタイムでコードを実行しない限り、パフォーマンスを向上させることはできません。あなたの状況に応じて実行可能かもしれません。
更新:Mono 2.2はリリース
他のヒント
C# は SSE 呼び出しを明示的に行うことができますか?
いいえ。C# ではインライン IL を生成することはできず、ましてやインライン x86/amd64 アセンブリを生成することもできません。
CLR、より具体的には JIT は、SSE が利用可能な場合にはそれを使用し、ほとんどの状況で SSE を強制する必要がなくなります。私が最もと言ったのは、私は SSE の専門家ではなく、それが有益であるにもかかわらず JIT が最適化を行わない場合があると確信しているからです。
SIMD for .NETは近日中に利用可能になります。 RyuJIT (.NET用の次世代JITコンパイラ)は、この機能ATMに必要です。
Microsoft.Bcl.SimdパッケージのMicrosoft.Numerics.Vectors.Vector<T>
クラスを使用する必要がありますこの機能を利用します。サンプルコードこちら。
このフォーラム投稿では、ターゲットマシンでSSEが利用可能な場合、MS JITコンパイラは自動的にSSEを使用します。
やりたい作業の「チャンク」がある場合、最善の策は、MMX / SSE組み込み関数を使用してC ++で記述し、機能をラップして公開する非常にシンプルな/ clr管理C ++クラスを作成することです.netクラスとして出力します。その後、コードはそのアセンブリを通常のクラスであるかのように使用できます。
VC組み込み関数の詳細については、私が何年も前に書いたこのちょっとした小技を見ることができます。
http://msdn.microsoft.com/en-us/library /0aws1s9k.aspx
ああ-あなたは実際に何かをスピードアップするために並列関数を使いたいと思っていると思います。他の人が指摘しているように-データを大きなチャンクなどで移動したいだけなら、JITはそれらの基本にSSEを使用する方法をすでに知っています。
Filipは正しいです。同様の、より詳細な例を示す別の古い投稿があります。私は実際にこのコードを実行し、自分で修正して、それが機能することを証明しました。私は現在取り組んでいるプロジェクトでこの手法を使用することを考えており、これが少し古いため、新しい可能性があるものを探しています。著者が示唆しているように、C ++で任意の関数を記述してコンパイルし、バイトをC#にコピーできます。
http://blogs.msdn.com/ b / devinj / archive / 2005/07/12 / 438323.aspx
JoeのCLI C ++クラスも良いアイデアであると付け加えますが、sseコンパイラフラグと/ clrフラグは同じプロジェクトで互換性があるとは思いません。 / clrは互換性がないため、SSE(/ arch:sseまたは/ arch:sse2)コンパイラフラグを使用するために、高いパフォーマンスコードを別のプロジェクトに記述する必要があります。いくつかの入力で単純な算術演算を行うよりもはるかに複雑な処理を行うには、これが最良のアプローチだと思います。
最近、MicrosoftはベータSIMDベクトルライブラリをリリースしました( Microsoft.Bcl.Simd )RyuJIT CTPのインストールを必要とし、Windows 8のみで動作するC#の場合
ネイティブSSEライブラリを使用して、C#から呼び出すこともできます。 Yepppライブラリの例については、このStackOverflowの回答をご覧ください。
もちろんできます(より重要な質問は-なぜだろうか?ランタイムに任せるだけです;それが仕事です)。
C#を使用すると、デリゲートをメモリアドレスにマップできます。そのメモリアドレスには、未加工のアセンブリコードを含めることができます。詳細については、 Michael Giagnocavoのブログ。
自分で試したことはありませんが、 Marshal.GetDelegateForFunctionPointer も同様です。