実行無効ビットを考慮して、VB.NET 2008 や C# などの高度な管理環境からネイティブ プロセッサに対して命令を実行する推奨される方法は何ですか。さらに、グラフィック プロセッサに対して GPU 命令を実行する際に同様のことを達成した人はいますか?
3 に答える
P/Invoke に戻したり、独自の C++ ラッパーを作成したりせずに直接アクセスするために、C# にはいくつかの GPU オプションがあります。
- ブラフマーはとても興味深いです。カスタマイズされた LINQ プロバイダーを介して GPU に直接アクセスできます。このコードには、GPU で実行される高度な計算メソッドのサンプルがいくつか含まれており、すべて LINQ を介して C# で記述されています。
- SlimDXは、すべての主要な DirectX 機能に優れた .NET ラッパーを提供します。カスタム シェーダーを使用すると、DirectX を介して GPU で計算を行うことができます。また、DX11 のサポートも含まれているため、計算シェーダーを直接使用できます (ハードウェアがある場合)。
- CUDA.NET経由で CUDA にアクセスできます。
- OpenCL.NET経由で OpenCL を使用できます。
CPU 命令に関しては、これには通常、アセンブラー命令を使用して低レベルのネイティブ コードにドロップする必要があります。おそらく、最も興味深い完全に管理された (少なくとも部分的に関連する) オプションは、 Mono.Simdを使用することです。これにより、Mono スタックでの実行時に、管理されたコードから CPU の SIMD 命令に直接アクセスできます。
これはオプションではありません。インライン アセンブリまたは組み込み関数を使用して、MASM によって生成された、またはアンマネージ C/C++ で記述された DLL 内の関数を P/Invoke する必要があります。または、C++/CLI コンパイラを使用して、#pragma managed で混合モード コードを生成します。
オペレーティング システムに適したプラットフォーム コードを生成する JIT コンパイラに依存できなくなったことに注意してください。[プロジェクト + プロパティ]、[ビルド] タブ、[プラットフォーム ターゲット] を使用して、アーキテクチャがアンマネージ コードと一致するように強制します。
マネージド GPU コードについては CUDA を参照してください。
任意の命令でアンマネージド .dll ライブラリを作成し、P/Invoke を使用して呼び出します。