Яндекс.Метрика

    Подсознание

    Распределенные вычисления на javascript

    На днях открыл для себя Life with Playstation, но суть не в нем, а в фоновом процессе Folding@home. Проект распределённых вычислений для проведения компьютерной симуляции свёртывания молекул белка. Пока мы читаем новости, смотрим погоду наша PS3 производит вычисления для Folding@home.

    И тут мне пришла идея, а почему бы не производить вычисления в браузере, пока пользователь работает на нашем сайте, ведь загрузка процесора при просмотре сайта минимальна.

    Долго не мог придумать, что же такое можно вычислять распределенно, дабы материализировать идею… Рендерить 3D сцену — не оправдано для теста и затратно по передаваемым данным. Вспомнилась простая лабораторная работа из студентческих годов по КМФП — визуализация потенциала поля с несколькими зарядами. Предельно просто, можно вычислять распределенно.

    Пример для вычисления


    Имеем 5 положательных и 5 отрицательных зяряда, случайно разбросанных в кубе 5.12 на 5.12 на 5.12 метра. Нужно вычислить потенциал поля в каждом сантиметре куба. Все просто — для каждого сантиметра пробегаемся по всем зарядам и суммируем потенциал для этого сантиметра.

    Мы имеем 512 слоев по 512х512 клеток. Для вычисления одного слоя у меня ушло 6 секунд. На все поле уйдет около часа.

    Размер полученных данных

    Пусть нам нужная такая точность вычислений, что в результате каждый сантиметр будет по 4 байта данных, то весь куб будет занимать 512Мб.

    Визуализация 300-го слоя

    image

    Как это может работать


    Клиент загружает скрипт, содержащий модуль вычисления(модель) и модуль I/O, тот в свою очередь запрашивает состояние модели и задание от сервера.
    Состояние модели: координаты всех точек и заряды, объем пространства для вычисления. Задание: интервал для вычисления, например с 512 по 1024 клетку (один ряд слоя).
    Клиент вычисляет по 512 клеток и отправляет эти данные серверу (2Кб данных). В ответ ему приходит новое задание на вычисление. И так далее.

    Для контроля должен существовать сервер выдающий задания для клиентов и принимающий результаты вычислений. Сервер имеет очередь заданий на вычисление. Каждое задание имеет таймаут, по истечении которого оно возвращается в очередь. Сервер сохраняет данные в хранилище (файл).
    Всего будет 262144 заданий по 512 клеток — 262144 блоков данных по 2Кб.

    image