Кроссплатформенный инструмент для выполнения произвольного кода для исследований

Я работаю над темой академического исследования, которая требует довольно много вычислений. Я создаю программное обеспечение на C++. Когда я буду в университете, у меня будет доступ к мощному серверу, но дома я хотел бы выполнять свой код на своем игровом ПК с Windows, который немного быстрее, чем мой 5-летний MacBook Pro.

Итак, есть ли инструмент, который позволяет мне взять двоичный файл Mach-O (двоичный файл OS X) из памяти, переместить его на ПК с Windows по сети и продолжить выполнение там. Я считаю, что это возможно, поскольку:

  • Я полагаюсь только на библиотеки только для заголовков (STL, Eigen).
  • Не делает многопоточность.
  • Вызовы, специфичные для OS X, не выполняются (нет системных вызовов)

Я думаю об этом так: x86 есть x86: просто скопируйте код в память как есть. На целевой машине выделите идентичное виртуальное адресное пространство, передайте состояние процессора x86 (используя pushfи popfинструкции) и возобновите вычисления.

Если что-то подобное существует, это, вероятно, потребует компоновки с библиотекой, которая имеет два вызова, например:

  • moveToSlave(): приостановить локальные вычисления и переместить весь двоичный файл на другую машину.
  • moveToMaster(): приостановить удаленное выполнение (которое является локальным на удаленной машине) и передать обновленное состояние памяти обратно на мастер (мой ноутбук).

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

Вы проверяли виртуальные машины? мне кажется решение VM подходит лучше всего. Тем не менее, я не знаю функции, которая непосредственно соответствует вашим требованиям. но отправной точкой могут быть моментальные снимки, пауза и возобновление работы виртуальной машины.

Ответы (2)

Во-первых, скомпилированный код C из одной ОС (Windows) вряд ли будет распознан в другой (MacOS). Не из-за OP-кодов, которые будут одинаковыми, если процессор тот же, а из-за структуры исполняемого файла, а также карты памяти. Также есть больше вызовов ОС, чем вы можете себе представить, например, malloc/new будет иметь некоторое взаимодействие с ОС.

Для многих подобных работ часто используется Python (с расширениями C или Cython для тяжелой работы), отчасти из-за независимости от ОС. Он также отлично подходит для параллельной обработки, включая распределенную обработку по сети.

Если вы можете реструктурировать свою обработку в несколько параллельных задач и использовать модель pub/sub, вы можете иметь любое количество узлов (от 1 и выше), работающих над вашей проблемой, и, если она правильно структурирована, вы сможете потерять узел в любой момент времени, при этом теряется только обработка этой части модели, которую необходимо выполнить заново. Таким образом, если вам нужно переключить машины, вы должны запустить новую машину перед остановкой старой, дать ей некоторое время, чтобы синхронизироваться с состоянием вашей обработки, а затем выключить старую машину.

Это очень обширная тема, и по ней написано несколько книг и множество научных статей.

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

  • Кроссплатформенный
  • Масштабируемость — если у вас одновременно доступно больше платформ, ваша обработка будет выполняться быстрее.
  • Быстрый
  • Поддержка нескольких языков обработки, включая C, Python и Go.

Но вам придется реструктурировать вашу задачу и код, чтобы сделать ее подходящей.

Как предложил @JawadAlShaikh, использование виртуальной машины для реальной обработки может сработать. Однако я только что проверил, VirtualBox отменит сохраненное состояние, если вы попытаетесь экспортировать vm.

Что может сработать, так это настроить VirtualBox на каждом хост-компьютере так, чтобы он указывал на внешний носитель (внешний жесткий диск через USB3 или eSATA) для хранения фактических виртуальных машин и информации о конфигурации на каждом компьютере. Подключите диск, загрузите машину, запустите VBox, возобновите сохраненное состояние и продолжайте вычисления.

Вторым вариантом может быть использование «удаленного» сервера — вашего домашнего компьютера или сервера, размещенного в Интернете одним из крупных облачных провайдеров или одним из более мелких, таких как linode.com — таким образом, вы можете работать на нем из любого места. и ваше местное оборудование не имеет значения. Запустите небольшой масштаб для разработки, а затем, когда вам нужно обработать большой набор данных, увеличьте размер машины и действуйте. После завершения анализа данных уменьшите его размер.