Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MPI.NET: Посылка данных узлам, Отправить данные узлам и получить ответ 
:(
    Опции темы
laykomdn
Дата 12.4.2012, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.4.2012

Репутация: нет
Всего: нет



Решил освоить MPI.NET + C#.
 Пишу тестовую программу для выбора точек. Лист точек делится на подлисты и раскидывается по нодам, они считаю и возвращают результат:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MPI;
 
namespace MPItest
{
    [Serializable]
    class Point
    {
        public int X, Y;
        public Point(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }
    [Serializable]
    class Program
    {
        static void Main(string[] args)
        {
            List<Point> points = new List<Point>();
            List<List<Point>> pointsToNode = new List<List<Point>>();
            List<Point> kpoints = new List<Point>();
            points.Add(new Point(0, 100));
            points.Add(new Point(0, 200));
            points.Add(new Point(0, 275));
            points.Add(new Point(100, 150));
            points.Add(new Point(200, 100));
            points.Add(new Point(250, 200));
            points.Add(new Point(0, 300));
            points.Add(new Point(100, 200));
            points.Add(new Point(600, 700));
            points.Add(new Point(650, 700));
            points.Add(new Point(675, 700));
            points.Add(new Point(675, 710));
            points.Add(new Point(675, 720));
            points.Add(new Point(50, 400));
 
            using (new MPI.Environment(ref args))
            {
                Intracommunicator comm = Communicator.world;
                
                if (comm.Rank == 0)
                {
                    for (int i = 0; i < comm.Size; i++)
                        pointsToNode.Add(new List<Point>());
 
                    if (comm.Size == 1)
                    {
                        kpoints = calc(points);
                    }
                    else
                    {
                        int j = 0;
                        for (int i = 1; i < = comm.Size; i++)
                        {
                            while (j != (i + 1) * (points.Count / comm.Size))
                            {
                                pointsToNode[i - 1].Add(points[j]);
                                j++;
                            }
                            comm.Send(pointsToNode[i - 1], i + 1, 0);
                        }
                        comm.Gather(kpoints, 0);
                    }
                }
                else
                {
                    comm.Receive(0, 0, out kpoints);
                    kpoints = calc(kpoints);
                    comm.Send(kpoints, 0, 0);
                }
            }
            int k = kpoints.Count;
            Console.WriteLine("kpoints = " + k);
        }
        static List<Point> calc(List<Point> points)
        {
            List<Point> lpoints = new List<Point>();
            foreach (Point p in points)
            {
                if (p.X > 100)
                    lpoints.Add(p);
            }
            return lpoints;
        }
    }
}


Компилирую с помощью mpiexec.
mpiexec -n 4 mpitest > out.txt 2> error.txt

 Для 1 процессора все отрабатывает корректно, для больше чем 1 программа виснет.
 В логах вот что:

Unhandled Exception: System.ArgumentException: Invalid rank, error stack:
 MPI_Send(175): MPI_Send(buf=0x0028F110, count=1, dtype=USER<struct>, dest=4, tag=0, MPI_COMM_WORLD) failed
 MPI_Send(101): Invalid rank has value 4 but must be nonnegative and less than 4
 Parameter name: rank
 at MPI.Communicator.Send[T](T value, Int32 dest, Int32 tag)
 at MPI.Communicator.Send[T](T value, Int32 dest, Int32 tag)
 at MPItest.Program.Main(String[] args) in C:\Users\user1\Documents\Visual Studio 2010\Projects\MPI\MPItest\MPItest\Program.cs:line 65
 unable to read the cmd header on the left child context, Other MPI error, error stack:
 ReadFailed(1317): An existing connection was forcibly closed by the remote host. (errno 10054).

 Aborting: mpiexec on user1 failed to communicate with smpd on user1
 Other MPI error, error stack:
 ReadFailed(1317): An existing connection was forcibly closed by the remote host. (errno 10054)

 Ошибка при отправке данных нодам. Но как ее решить не могу понять.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.