Как можно с модулировать вычислительную сеть и посчитать ее помощью?
Задача на первый взгляд простая, но гугление ни к чему не привело, если у кого есть опыт то пожалуйста подскажите.
Собственно задача:
1 создать модель вычислительной сети. (тут надо сказать что ничего я нашел только одну программу(omnet++), но она ужасна и не удобна).
1.1 в сети есть сервер и N других компьютеров (Клиенты)
2 Сеть надо запрограммировать так что бы она могла умножить две матрица. То есть, первый Клиент умножат первую строку первой матрицы на первый столбец второй матрицы, Второй Клиент второруй строку первой матрицы умножает на второй столбец второй матрицы, ну и так далее. Затем все Клиенты отсылают свои результаты Серверу который формирует итоговую матрицу.
Основная задача наглядно показать что вычислительная сеть (аля супер компьютер) может выполнять некие операции (в нашем случаи умножение матриц).
ПС: буду благодарен за любую помощь.Готов уточнять если что то не понятно (первый раз пишу вопрос в нете :) ).
Клиент-сервер я сделал (на java), мене не понятно как распределить задачу между клиентами (в java я новичок ), но я копаю в этом направлении ))) И как я писал выше, важна наглядность.
О! да очень просто. Делаете RMI-сервер. Каждый подключившийся клиент вызывает удаленный метод getJob() например. Удаленный метод (на стороне сервера) дает клиенту следующую строку матрицы (и просто запоминает какую строку дать в следующий раз). Как только строка матрицы посчитана, клиент вызывает sendResult() с результатом для какой строки матрицы и опять запрашивает getJob(). Сервер в методе sendResult смотрит, посчитаны ли все строки матрицы, если посчитаны, то завершает работу!
Соответственно каждый клиент будет получать только свою строку и возвращать немедленно только свой результат, снова запрашивать и так до бесконечности. Тем самым у вас будет от одного до N клиентов.
можно использовать MPI, но ему для работы нужен кластер. Можно использовать самопал (есть на готове одна разработка), но расчеты в такой сети имеют смысл лишь если их вычисление занимает времени больше (хотя бы на порядок) чем передача данных для вычисления по сети, то есть если у вас матрица 100*100 ее выгоднее распараллелить на 1 машине, чем гонять по сети данные для расчета. Грубо говоря можно так, если у вашей задачи "умножение 1 строки на 1 столбец" уходит для расчета хотябы 10 мс тогда имеет смысл думать о разделении вычислений, в противном случае накладные расходы на передачу данных в вычислительной сети сожрут все преимущество в распределении вычислений.
MPI это здорово, но в моем случаи это как гвоздь микроскопом забивать))) Мне важно наглядность (поэтому симулятор/модулятор сети, и "накладные расходы" меня не волнуют ), что бы показать мол есть Сервер и Клиенты каждый может делать то или это, а в результате матрица посчитана (так как это для наглядности матрица 4Х4 хватит ;) ). А что за "самопал"? можно глянуть?
Roman: Я его еще не публиковал, грубо говоря вы описываете функцию на C#, она передается любому числу исполнителей в локальной сети, далее все они подключаются к тому, кто готов дать задание для них и с помощью имеющейся функции и данных, которые им дают решают задачу, результат отдают обратно. Все описаное работает в 3 строчках кода. Но наглядностью там и не пахнет, потому как весь процесс прозрачен. Тут скорее тогда нужно какой то редактор анимации типа flash или на крайний случай powerpoint и в нем это "анимировать", мол тут столбец отлетел к значку сервера 1 и т.д. будет и наглядно и понятно.
Технология называется Map-Reduce. Реализуется, например, Apache Hadoop, или Mongodb, но задача освоения довольно сложная. Возможно есть какие-то другие более простые варианты.