1

C# プロジェクトを構築しています。このプロジェクトでは、CUDA を通じて NVidia の Tesla を使用します。CUDA C のネイティブ実装は C# に直接公開されておらず、私の意見では、利用可能な C# ラッパー (Brahma、CUDAfy、Linq から GPU など) は、本番用に十分に成熟していません。

私は先に進み、公式にサポートされている方法である CUDA にアクセスする C++ コンポーネントで数学ロジックを構築することにしました。CLR 拡張機能をサポートしていないインテル C++ コンパイラーをパフォーマンスのために使用しているため、C++/CLI はオプションではありません。

私の最も重要な基準はパフォーマンスであるため、C++ (ビジネス ロジックが存在する場所) と .NET (残りのアプリケーション) の間で配列のマーシャリングとコピーを最小限に抑えようとします。

この質問が以前に尋ねられたことは承知していますが、ほとんどの場合、C++ ライブラリは既に存在し、C++/CLI がオプションである場合もありますが、ここでは両方の状況が当てはまりません。

C++ ライブラリをゼロから C++ で作成することを考えると、C# に公開するための最良の方法を決定する立場にいます。C++ と .NET の統合を最も簡単かつ最高のパフォーマンスで実現するために従うべき推奨事項やベスト プラクティスはありますか? 私が交換するものはほとんどが大きな配列であることに注意してください

編集: GPU へのアクセスを容易にするインフラストラクチャ ライブラリではなく、ビジネス ロジック (数学) を C++ で構築していることを明確にします。

4

1 に答える 1

1

十分に成熟していないと思われる既存のライブラリよりも優れたパフォーマンスを発揮することは確かに可能ですが、ここでこの質問をしているという事実そのものが、独自のライブラリ/実装を展開することを決定することを再考する必要があります!

安定性や信頼性などの特定のパフォーマンスを超えた考慮事項は、これが本番環境に移行する場合の主な関心事です。一般に、自分が何をしているのかを理解していない限り、コミュニティや他の開発者チームの努力を複製することは、滑りやすい坂道になる可能性があります。

この回答があなたの質問に実際に対応していないことはわかっていますが、定式化されているため、私の意見ではあなたの質問は広すぎて簡単な答えはありません。最初はこれをコメントとして投稿するつもりでしたが、長すぎてフォーマットに収まらないと判断しました。

最後に、既存のライブラリを試してみることをお勧めします。パフォーマンスの観点からそれらが適切でない場合は、具体的な質問を開始することをお勧めします。

アップデート

ほとんどのロジックを C++ で実装し、一部の結果を配列の形式でマネージ コードに戻すことを期待している場合、行う必要があることはあまりありません。一般に、配列の自動マーシャリングは、得ようとしているのと同じくらい効率的です。

私がお勧めすることの 1 つは、マーシャリングについてできるだけ多くのことを読み、パフォーマンス プロファイラーを使用してから、物事を改善するために「創造的」になることを決定することです。

最後に興味深いアイデアを 1 つ紹介しますが、これを使用する前にプロファイリングする必要があります。メモリ マップト ファイルをデータのバッキング ストアとして使用し、両端からファイルを開くこともできます。最終的に、これは役に立つかもしれないし、役に立たないかもしれないので、購入する前に必ずプロフィールを作成してください;)

于 2013-03-07T21:00:28.760 に答える