Grid Computing API

Я хочу написать распределенную программную систему (систему, в которой вы можете выполнять программы быстрее, чем на одном компьютере), которая может выполнять программы различного типа (поскольку это школьный проект, я, вероятно, буду выполнять такие программы, как Prime finder и Pi калькулятор на нем)

Я предпочитаю, чтобы он был написан для C# с.NET, имел хорошую документацию, был прост в написании (не нов в C# с.NET, но я не профессионал) и чтобы можно было легко писать задачи для сетки и / или загружать программы в сеть напрямую из.exe.

Я немного посмотрел на:

  1. MPAPI
  2. Используйте (от создателей Алхимии)
  3. NGrid ( устарел?)

Какой из них лучше для моего случая? Есть ли у вас опыт работы с ними?

пс. Мне известно о многих подобных вопросах, но они либо устарели, либо не дали правильных ответов, либо не ответили на мой вопрос, и поэтому я решил задать еще раз.

2 ответа

Я только что связался с основателем Utilify (Кришна Надиминти), и хотя активная разработка пока приостановлена, он любезно выпустил весь исходный код здесь, на Bitbucket.

Я думаю, что стоит продолжить этот проект, так как в настоящее время нет практически никакой сопоставимой альтернативы (даже коммерческой). Я могу начать работать над этим, но не жди меня:).

У меня такая же проблема. Я пробовал 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();

    }
}
Другие вопросы по тегам