Herramienta de ejecución de código arbitrario multiplataforma para investigación

Estoy trabajando en un tema de investigación académica que requiere bastante computación. Estoy construyendo el software en C++. Cuando esté en la universidad, tendré acceso a un servidor robusto, pero para mi tiempo en casa, me gustaría ejecutar mi código en mi PC para juegos con Windows, que es bastante más rápida que mi MacBook Pro de 5 años.

Entonces, ¿hay alguna herramienta que me permita tomar un binario Mach-O (binario OS X) de la memoria, moverlo a la PC con Windows a través de la red y continuar la ejecución allí? Creo que esto podría ser posible, ya que:

  • Solo confío en bibliotecas de solo encabezado (STL, Eigen).
  • No hacer multiproceso.
  • No se realizan llamadas específicas de OS X (sin llamadas al sistema)

Pienso en ello como: x86 es x86: simplemente copie el código en la memoria tal como está. En la máquina de destino, asigne un espacio de direcciones virtuales idéntico, transfiera el estado del procesador x86 (uso pushfe popfinstrucciones) y reanude los cálculos.

Si existe algo como esto, probablemente implicaría la vinculación con una biblioteca que tiene dos llamadas como:

  • moveToSlave(): pausa el cálculo local y mueve todo el binario a la otra máquina.
  • moveToMaster(): pause la ejecución remota (que es local en la máquina remota) y transfiera el estado de memoria actualizado al maestro (mi computadora portátil).

Sé que es una posibilidad remota, y dicho software sería altamente experimental.

¿Revisaste las máquinas virtuales? me parece que la solución VM es la mejor opción. Sin embargo, no conozco ninguna característica que cubra directamente sus requisitos. pero las instantáneas, la pausa y la reanudación de la máquina virtual pueden ser el punto de partida.

Respuestas (2)

En primer lugar, es poco probable que el código C compilado de un sistema operativo (Windows) se reconozca en otro (MacOS). No por los Códigos OP, que serán los mismos si el procesador es el mismo, sino por la estructura del archivo ejecutable y también el mapa de memoria. También hay más llamadas al sistema operativo de las que podría darse cuenta, por ejemplo, malloc/new tendrá alguna interacción con el sistema operativo.

Para gran parte de este tipo de trabajo, a menudo se usa Python (con extensiones C o Cython para el trabajo pesado), en parte debido a la independencia del sistema operativo. También es excelente para el procesamiento en paralelo, incluido el procesamiento distribuido en una red.

Si puede reestructurar su procesamiento en una serie de tareas paralelas y utiliza el modelo pub/sub, puede tener cualquier número de nodos (desde 1 en adelante), trabajando en su problema y, si está estructurado correctamente, podrá pierde un nodo en cualquier momento y solo se pierde el procesamiento de esa parte del modelo y es necesario volver a hacerlo. Por lo tanto, si necesita cambiar de máquina, debe iniciar la nueva máquina antes de detener la anterior, darle algo de tiempo para sincronizar el estado de su procesamiento y luego apagar la máquina anterior.

Este es un tema muy amplio y hay algunos libros y muchos artículos académicos sobre el tema.

Para llegar finalmente a algún software específico para este tipo de problema, una de las herramientas comunes a utilizar es NSQ .

  • Plataforma cruzada
  • Escalable: si tiene más plataformas disponibles a la vez, su procesamiento se realizará más rápido
  • Rápido
  • Soporte para múltiples lenguajes de procesamiento, incluidos C, Python y Go.

Pero tendrá que reestructurar su problema y código para que sea adecuado.

Como sugirió @JawadAlShaikh, usar una máquina virtual para el procesamiento real podría funcionar. Sin embargo, acabo de comprobar que VirtualBox descartará el estado guardado si intenta exportar la máquina virtual.

Lo que puede funcionar es configurar VirtualBox en cada máquina host para que apunte a medios externos (disco duro externo a través de USB3 o eSATA) para almacenar las máquinas virtuales reales y la información de configuración en cada máquina. Conecte la unidad, inicie la máquina, ejecute VBox, reanude el estado guardado y continúe con la computación.

Una segunda opción podría ser usar un servidor "remoto", ya sea su PC en casa o uno alojado en línea por uno de los grandes proveedores de nube o uno de los más pequeños como linode.com, de esta manera puede trabajar en él desde cualquier lugar. y su hardware local no importa. Ejecute a pequeña escala para el trabajo de desarrollo, luego, cuando necesite procesar un gran conjunto de datos, aumente el tamaño de la máquina y hágalo. Cuando finalice la ejecución del análisis de datos, vuelva a reducir su tamaño.