16

SlimDX を使用して C# で記述された私の 3D グラフィックス ソフトウェアは、CPU で多くのベクトル演算を実行します。(この特定の状況では、作業を GPU にオフロードすることはできません)。

ベクトル演算を高速化するにはどうすればよいですか? これまでのところ、次のアプローチを見つけました。

  • SIMD をサポートしているため、Microsoft .NET ではなく Mono で実行します。このプロジェクトのオプションではありません。
  • SlimGenは、実行時に高性能の数学コードを挿入するプロジェクトです。残念ながら、プロジェクトはまだ使用可能な状態ではありません。
  • SSE 命令を利用するコンパイラを使用して、C++ で DLL を記述します。C# からその DLL と相互運用します。

.NET でより高速なベクトル演算を実現する他のオプションはありますか?

4

5 に答える 5

8

Microsoft Visual C++ のコンパイラを使用して DLL を記述します。標準 C++ と SSE 組み込み関数、および/または重い数値コード用の OpenMP を使用し#pragma unmanagedます。#pragma managedC# が使用できるクリーンな C++/CLI API を定義するために使用します。

C++ の相互運用性は、p/invoke よりもかなり高速です。また、C++/CLI は、ガベージ コレクションされたメモリとネイティブ関数の仮定 (メモリ ブロックは移動しない) の両方を処理する唯一の洗練された方法です。

OpenGL 呼び出しの一部を C++ に移動し、VBO をロードするために C++ に割り当てられたメモリ バッファーを直接使用することなどでも、パフォーマンスが大幅に向上することがあります。

于 2013-03-30T23:48:19.703 に答える
4

Microsoft は、バックエンド C++ コンパイラの最適化のおかげで、.NET ネイティブ コンパイラでのベクトル化された命令の生成のサポートを発表しました。さらに重要なのは、最新バージョンの JIT (「RyuJIT」) での SIMD ベクトル型のネイティブ サポートです。ここでいくつかのサンプルを参照してください。

于 2014-04-04T15:00:08.387 に答える
2

.NET の最新の開発には、System.Numerics.Vector と呼ばれる SIMD 専用のベクトル/行列ライブラリが含まれます。

グラフィックス プログラミングのための System.Numerics.Vector の使用

これは、新しい JIT コンパイラ「RyuJIT」がデフォルトになるとすぐに有効になります。発表は次のとおりです。

RyuJIT: .NET 用の次世代 JIT コンパイラ

そのため、間もなく (できれば 2015 年)、プログラミング オーバーヘッドなしで .NET で非常に高速な SIMD ベクトルを使用できるようになります。

于 2015-03-20T13:36:28.303 に答える
0

.NET とネイティブ コードの混在。この場合、x86 用のリリースと x64 用の別のリリースが必要になります。混合 (ネイティブおよびマネージド) アセンブリを表示できます[MSDN]

于 2013-03-30T23:48:13.337 に答える