4

さまざまな種類のプログラムを実行できる分散型ソフトウェア システム (1 台の PC よりも高速にプログラムを実行できるシステム) を作成したいと考えています (これは学校のプロジェクトなので、おそらく Prime finder や Pi などのプログラムを実行します)。その上に電卓)

私の好みは、.NET を使用して C# 用に記述し、優れたドキュメントを用意し、簡単に記述できるようにし (.NET を使用した C# では新しいものではありませんが、私は専門家ではありません)、グリッドのタスクを簡単に記述できるようにすることです。または、プログラムを .exe からネットワークに直接ロードします。

私は少し見てきました:

  1. MPAPI
  2. Utilify (Alchemy のメーカーから)
  3. NGrid (古い?)

私のケースにはどれが最適ですか?それらについての経験はありますか?

ps。ここで同様の質問がたくさんあることは知っていますが、それらは時代遅れであるか、適切な回答がないか、私の質問に答えていないため、もう一度質問することにしました.

4

2 に答える 2

2

Utilify の創設者 (Krishna Nadiminti) に連絡を取ったところ、アクティブな開発は現在一時停止していますが、親切にも Bitbucket ですべてのソース コードをリリースしてくれました。

私は、このプロジェクトを継続する価値があると思います。現時点では、文字通り同等の代替手段がありません (商業的であっても)。私はそれに取り組み始めるかもしれませんが、私を待たないでください:)。

于 2013-03-29T13:35:44.330 に答える
0

同じ問題が発生しました。NGrid、Alchemi、MS PI.net を試しました。結局、私は自分のオープン ソース プロジェクトを開始して遊んでみることにしました。ここをチェックしてください: http://lucygrid.codeplex.com/

アップデート:

PI の例の外観を参照してください。AsParallelGridに渡された関数は、グリッド ノードによって実行されます。DEMO プロジェクトを実行して遊ぶことができます。

/// <summary>
/// Distributes simple const processing
/// </summary>
class PICalculation : AbstractDemo
{

    public int Steps = 100000;
    public int ChunkSize = 50;
    public PICalculation()
    {

    }

    override
    public string Info()
    {
        return "Calculates PI over the grid.";
    }


    override
    public string Run(bool enableLocalProcessing)
    {
        double sum = 0.0;
        double step = 1.0 / (double)Steps;
        /* ORIGINAL VERSION
        object obj = new object();

        Parallel.ForEach(
            Partitioner.Create(0, Steps),
            () => 0.0,
            (range, state, partial) =>
            {
                for (long i = range.Item1; i < range.Item2; i++)
                {
                    double x = (i - 0.5) * step;
                    partial += 4.0 / (1.0 + x * x);
                }
                return partial;
            },
            partial => { lock (obj) sum += partial; });
        */
        sum = Enumerable
            .Range(0, Steps)
            // Create bucket
            .GroupBy(s => s / 50)
            // Local variable initialization is not distributed over the grid
            .Select(i => new 
            {
                Item1 = i.First(),
                Item2 = i.Last() + 1, // Inclusive
                Step = step
            })
            .AsParallelGrid(data =>
            {
                double partial = 0;
                for (var i = data.Item1; i != data.Item2 ; ++i)
                {
                    double x = (i - 0.5) * data.Step;
                    partial += (double)(4.0 / (1.0 + x * x));
                }
                return partial;
            }, new GridSettings()
            {
                EnableLocalProcessing = enableLocalProcessing
            })
            .Sum() * step;
        return sum.ToString();

    }
}
于 2015-01-26T18:47:37.073 に答える