MeXaN1cK 53 Опубликовано: 8 марта, 2017 Всем привет! Собственно вот какая идейка пришла нам, товарищам из IRC, а что если связать несколько компов и заставить их обрабатывать 1 задачу, тем самым добиться многопоточности. Собственно задача - Написать либу для связки компов между собой и разделение задачи на составные части с их последующей обработкой и выведением результата. P.S Большая просьба - не флудить не по делу и не писать сообщения типа "связать через модемы и заставить считать". Предлагайте готовые участки кода, если таковые имеются.Будем очень благодарны. Если есть желания присоединиться к команде разработки - заходите в IRC, там и скооперируемся. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 8 марта, 2017 (изменено) Я как соавтор идеи поддерживаю её и может даже поучаствую в разработке. Основная идея пока такова: Делаем всё просто. Как с Zn. Реализуем небольшую либу для распределённых вычислений. Этакий Supercomputer API. Его задача будет - собрать компьютеры-ноды в один кластер - получать от юзера фрагменты задачи (самое простое в виде строки-кода) - распределять между свободными нодами кластера - получать результаты от нод, которые завершили вычисление - мерджить результат (по алгоритму предоставленному юзером) либо организовывать общение с нодами кластера в реальном времени Самый главный плюс всей идеи - реальная многопоточность. Все вычисления будут происходить параллельно, в реальном времени на разных компьютерах кластера. Наша задача - придумать максимально простую и удобную в использовании библиотеку под это дело. Изменено 8 марта, 2017 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 8 марта, 2017 Что вы там собрались делать? Для каких целей вам многопоточность понадобилась? У меня кстати есть рабочая идея, как ускорить отображение изображений. Например нам нужно одновременно, чтобы несколько игроков бегали по экрану и чтобы экран не тормозил при отображении. Решение - подключить к одному монитору с клавой несколько компов, распределить задачи для каждого компа. Один отображает первого игрока, второй комп второго, третий третьего. В итоге скорость прорисовки заметно возрастёт. Так как каждый комп подключён к одному монитору и способен спокойно с ним работать, позволяя монитору работать выше своих возможностей. Можно так мультиплеерные игры спокойно делать. Как в старых играх делить экран на 2 или 4 части и каждую часть использовать под экран для одного игрока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ivan52945 75 Опубликовано: 8 марта, 2017 (изменено) Что вы там собрались делать? Для каких целей вам многопоточность понадобилась? У меня кстати есть рабочая идея, как ускорить отображение изображений. Например нам нужно одновременно, чтобы несколько игроков бегали по экрану и чтобы экран не тормозил при отображении. Решение - подключить к одному монитору с клавой несколько компов, распределить задачи для каждого компа. Один отображает первого игрока, второй комп второго, третий третьего. В итоге скорость прорисовки заметно возрастёт. Так как каждый комп подключён к одному монитору и способен спокойно с ним работать, позволяя монитору работать выше своих возможностей. Можно так мультиплеерные игры спокойно делать. Как в старых играх делить экран на 2 или 4 части и каждую часть использовать под экран для одного игрока. 1)Просили же не флудить 2)Зачем это надо? а)интересно б)почему бы и нет в)ещё не известно, что может пригодиться в будущем Изменено 8 марта, 2017 пользователем ivan52945 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 8 марта, 2017 (изменено) Ну это не флуд, а дельная идея. Я вот предлагал Лёхе попробовать рендер 3D графики распределить через кластер. Но в любом случае, сначала надо спроектировать библиотеку. 2)Зачем это надо? Для прикола. Это крутая идея, и будет прикольно её увидеть работающей. Изменено 8 марта, 2017 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant 442 Опубликовано: 8 марта, 2017 (изменено) Идея как это запилить: вся программа делится на максимально маленькие функции, которые выполняются на любом из компов, и один главный комп, который соединяет функции в вычислительную цепочку, а затем её выполняют. function sum(a, b) return a + b end function sub(a, b) return a - b end sumres = sum(value1, value2) --функция не считается, но припопытке получить значение, subres = sub(sumres, value3) --происходит вычисление, со всеми переменными, которые функции требуют value1 = 1 value2 = 2 value3 = 0.1 print(subres) -- 2.9 P. S. Чисто концепт Изменено 8 марта, 2017 пользователем Quant Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 8 марта, 2017 ... Ты изобрел ленивые вычисления Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 8 марта, 2017 Я думаю вопрос разделения задачи на составные части нас вообще не должен волновать. Мы - чисто исполнители. Юзер сам думает, как ему разделить задачу. Например юзеру надо перемножить числа от 1 до 400. (Это не слишком сложная задача, но для примера сойдёт.) Он может юзать нашу либу так (псевдокод): -- подключаем либы local event = require('event') local cluster = require('supercomputer') -- инициализируем кластер cluster.init() -- тут генерим строки-программки, для нашей задачи function step(x) return "local n = " .. tostring(x) .. "; for i = n, n+100 do n = n * i end; return n" end -- задаём кластеру несколько параллельных задач cluster.setup("process1", step(1)) cluster.setup("process2", step(101)) cluster.setup("process3", step(201)) cluster.setup("process4", step(301)) -- запускаем на выполнение cluster.run() -- сюда будем складывать результаты local result = 1 while true do -- слушаем эвенты от кластера local name, address, action, x = event.pull('cluster') if name == 'cluster' then -- если получили очередное вычисленное значение - добавляем к результату if action == 'result' then result = result * x -- если все "процессы" закончили работу - сворачиваемся else if action = 'done' then break end end end -- сбрасываем все задачи кластера, или "гасим" его или ещё что-то cluster.reset() -- выводим результат print("Произведение чисел от 1 до 400 = " + result) Тут мы раздали задачи кластеру, запустили, собрали ответы и получили результат. Вычисление заняло в 4 раза меньше времени (потенциально), чем если бы мы считали на одном процессоре. Разумеется для мелких задач результат будет почти не заметен. Но на достаточно сложных вычислениях он должен проявляться сильнее. Здесь программа очень проста. Нет отображениия промежуточных этапов и т.п. Но идею иллюстрирует. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 8 марта, 2017 Например юзеру надо перемножить числа от 1 до 400. (Это не слишком сложная задача, но для примера сойдёт.) Для такой задачи нужна библиотека-помощник для хранения таких огромных чисел. Будет 869 цифр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 8 марта, 2017 Для такой задачи нужна библиотека-помощник для хранения таких огромных чисел. Будет 869 цифр. Да, тут надо продумать вопрос с тем, как поднять в кластере нужное окружение. Можно скрипт для HPM замутить. =) Который будет окружение разворачивать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 8 марта, 2017 Что-то вы разбираете лёгкие примеры, а как насчёт более сложных алгоритмов, как их разбивать собираетесь? Например как разбить алгоритм нахождения и заноса в таблицу простых чисел. Без многопоточности алгоритм используя таблицу с первыми простыми числами самозаполняет себя. А вот как разбить подобный алгоритм я вообще не в курсе, это реально? Или вот пример, нужно рассчитывать и заносить числа Фибоначчи в таблицу. Как этот алгоритм собираетесь разбивать? Для каких целей вообще собираетесь свою многопоточность использовать? Чтобы детские задачи решать??? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 8 марта, 2017 Что-то вы разбираете лёгкие примеры, а как насчёт более сложных алгоритмов, как их разбивать собираетесь? Например как разбить алгоритм нахождения и заноса в таблицу простых чисел. Без многопоточности алгоритм используя таблицу с первыми простыми числами самозаполняет себя. А вот как разбить подобный алгоритм я вообще не в курсе, это реально? Или вот пример, нужно рассчитывать и заносить числа Фибоначчи в таблицу. Как этот алгоритм собираетесь разбивать? Для каких целей вообще собираетесь свою многопоточность использовать? Чтобы детские задачи решать??? Очевидно что нереально разбить на потоки алгоритм, который разбить на потоки нереально. Но это проблема юзера. Я не говорю, что либа будет панацеей. Либа будет решать те задачи, какие потребуется выполнить пользователю. Не важно, детские или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 8 марта, 2017 Что-то вы разбираете лёгкие примеры, а как насчёт более сложных алгоритмов, как их разбивать собираетесь? Например как разбить алгоритм нахождения и заноса в таблицу простых чисел. Без многопоточности алгоритм используя таблицу с первыми простыми числами самозаполняет себя. А вот как разбить подобный алгоритм я вообще не в курсе, это реально? Или вот пример, нужно рассчитывать и заносить числа Фибоначчи в таблицу. Как этот алгоритм собираетесь разбивать? Для каких целей вообще собираетесь свою многопоточность использовать? Чтобы детские задачи решать??? Распараллелить можно все почти, если руки прямые. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 8 марта, 2017 (изменено) Распараллелить можно все почти, если руки прямые. Вот только дело в том, что задачи которые долго решаются, такого типа как я описал, судя по всему нельзя распараллелить. А это очень плохо. И я всё ровно не понял, какая область применений у вашего распараллеливания. Он то по сути в майне то и не нужен. Может быть он поможет турели быстрее реагировать на цель? Или свинокоптеру летать быстрее (хотя стоит похоронить уже этот свинокоптер с приходом новой версии майна) А может распараллеливание позволит роботу сканировать руды быстрее? Хм, вроде бы нет. Тогда зачем оно в майне? Я бы понял, если бы вы как ECS стремились оптимизировать и улучшить графику, которую имеет смысл улучшать для создания видеоигр и лучшей работы отображения обычных программ. Но вы хотите сделать такую систему, которая будет давать преимущества не понятно для кого. Сейчас по сути события в библиотеки event отлично справляются с частью задачей, которые вы собираетесь сделать. А именно они позволяют обрабатывать псевдоодновременно несколько задач. А другая часть задач - решения более быстрее задач вообще никому не нужна. Изменено 8 марта, 2017 пользователем qwertyMAN 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 8 марта, 2017 ... Хватит флудить не по делу, многопоточность это просто развлечение, как и сам майн 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
PandaDoddo 13 Опубликовано: 8 марта, 2017 (изменено) Ребят , я так понимаю вы хотите делить задачу на куски а потом обратно собирать для увеличения скорости обработки? Изменено 8 марта, 2017 пользователем PandaDoddo Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Quant 442 Опубликовано: 8 марта, 2017 Ребят , я так понимаю вы хотите делить задачу на куски а потом обратно собирать для увеличения скорости обработки? Да, разбивать задачу на куски и запускать на нескольких компах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 9 марта, 2017 Я как-то занялся распараллеливанием вычислений через интернет, хотел связать несколько сотен компов/роботов на нескольких серверах, чтобы считать генетические алгоритмы, даже был алгоритм перераспределения задач при изменяющимся количестве компов (который придумали лет эдак за 60 до меня). Теоретически, результат можно было бы получать на порядки быстрей, но дело не дошло даже до пробного запуска, т. к. комп не тянет перегруженные модами сборки и меня закидали навозом всякие умники, обвиняя в нерациональном использовании ресурсов серверов. Разбить на фрагменты можно любую задачу, но тут нужен баланс, некоторые задачи придется формулировать очень громоздко, как это делают на реальных суперкомпьютерах. Было-бы эффективней, если был бы транслятор, разбивающий любой алгоритм без участия пользователя, для этого надо изучить алгоритмы готовых распределенных вычислений. А связать это все вместе не составит большого труда. Надо Квертику ограничить количество сообщений в день, т. к. он по любому вопросу ни в зуб ногой, но очень любит высказаться не подумав. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 155 Опубликовано: 9 марта, 2017 (изменено) Теоретически, результат можно было бы получать на порядки быстрей, но дело не дошло даже до пробного запуска, т. к. комп не тянет перегруженные модами сборки и меня закидали навозом всякие умники, обвиняя в нерациональном использовании ресурсов серверов.Нерациональное использование ресурсов серверов в большинстве случаев как раз и получится, OpenComputers не создавался для масштабных вычислений. Для вычислений гораздо эффективнее использовать внешние для Майнкрафта сервера. Польза от такой библиотеки проявится не столько в вычислениях, сколько при обращениях ко всякого рода медленной периферии вроде отладочной платы.Но для этого есть средства попроще. Изменено 9 марта, 2017 пользователем eu_tomat 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Гость Kartze Опубликовано: 9 марта, 2017 Хм. Для каких конкретно вычислений можно будет задействовать данную... ээ... вещь? Возможно ли прикрутить эту опенкомпьютерную систему к реальной, типа BOINC? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах