16

Parallel Linqなどのシステムを使用すると、無名関数やクエリなどの実行を1台のマシン内の複数のコアとスレッドに分割することができます。これを拡張して、forループ(など)やs、 sなどのParallel.For()値型などの標準言語構造を使用して複数のマシンで実行し、アプリケーションソースの変更を最小限に抑える機能が必要です。理想的には、これにより、プロジェクトを開き、メソッドに属性を追加し、再コンパイルして拡張機能にアクセスできるようになります。intstruct

次のようなものが必要なようです。

  1. コンパイルされたコードブロック(ラムダなど)をキャプチャし、必要なデータとともに別のノードで実行されているワーカープロセスに渡す機能、または

  2. 問題のコードをキャプチャするプリプロセッサを提供し、変数参照などをネットワーク通信、キャッシング、その他の必要なアセットへのアクセスを処理するクラスへの参照に置き換える一種のテンプレートプロジェクトにコンパイルし、他のマシンで実行されている使用可能なワーカーノードへの結果のDLL。

Roslynは、ここで役立つツールをいくつか提供しているようです。これを可能にするために現在のコンパイルパイプラインにフックする方法はありますか?

編集

さて、私はこれが可能であることを知っています、なぜならこれらの人はそれをしたからです。問題は、どのように?

4

2 に答える 2

11

Parallel Linq などのシステムを使用すると、匿名関数やクエリなどの実行を、1 台のマシン内の複数のコアとスレッドに分割できます。これを拡張して、for ループ (Parallel.For() など)、int や構造体などの値型などの標準言語構造を使用して複数のマシンで実行できるようにし、アプリケーション ソースの変更を最小限に抑えたいと考えています。 .

いいね。実際、Microsoft Research には非常によく似たシステムがありますが、明らかに詳細についてはお話しできません。

コンパイルされたコード ブロック (ラムダなど) をキャプチャし、必要なデータと共に、別のノードで実行されているワーカー プロセスに渡す機能が必要です。

わかりました。その機能を C# 3 に追加しました。それが LINQ to SQL のしくみです。どういうわけか、LINQ クエリはデータベースにアクセスする必要があります。コンパイルされたラムダは、クライアント マシンで照会され、サーバー ノードに送信されるクエリに変換され、結果が返されます。

Roslyn は、ここで役立ついくつかのツールを提供しているようです。これを可能にするために現在のコンパイル パイプラインにフックする方法はありますか?

それは Roslyn の目的ではありません。Roslyn は、C# 言語に新しい機能を追加することではありません。これは、コードを分析してリファクタリング エンジンなどを構築しやすくするためのものです。

コンパイル パイプラインにフックする必要はありません。PLINQ はコンパイラを変更せず、LINQ to SQL はコンパイラを変更しません。ラムダを式ツリーに変換すると、コンパイラはラムダを表す式ツリーを実行時に作成するコードを出力します。その式ツリーを調べて、ネットワーク内の別のマシンにシリアル化し、逆シリアル化し、デリゲートに変換して実行することができます。

おそらく、独自の式ツリー シリアライザーとデシリアライザーを作成する必要がありますが、これらは非常に単純なデータ構造です。不変のツリーであるため、シリアル化と逆シリアル化が非常に簡単になります。それらは常にリーフノードから構築されるため、複雑なネットワークを実際に形成することはできません。

于 2011-12-28T19:39:23.317 に答える
10

ブラフマーがすることをするために、言葉を拡張する必要はありません。彼は、式ツリーを解析して GPGPU コードを出力するカスタム クエリ プロバイダーを実装しました (LINQ to SQL は同じことを行いますが、SQL を使用します)。

プロバイダーの実装を開始して実行できるMSDN の基本ガイドをここにリンクしました。IQueryable

難しいのは、式ツリーをたどって OpenCL コードを生成することです。それができたら、それを Cloo に渡すだけで実行できるはずです。

編集

標準の .NET コードをコンパイルするツールを GPU コードに属性 でリンクしました[Kernel]。ビルド後のツールでコンパイル済み IL の属性を検索し、IL 書き換えを実行して GPU 呼び出しを生成することでこれを行います。これは、AOP ソリューションであるPostSharpに似ています。

IL の書き換えは時間がかかり、大変な作業ですが、このルートを使用することもできます。

于 2011-12-28T18:36:36.790 に答える