【问题标题】:c++ Distributed computing of an executable programc++ 一个可执行程序的分布式计算
【发布时间】:2012-07-19 14:49:14
【问题描述】:

我想知道是否可以在不添加源代码的情况下运行可执行程序,例如在多台计算机上运行任何游戏。当我在 c# 中编程时,我注意到一个进程方法,它可以让你调用或关闭任何应用程序或进程,我想知道是否有类似 c++ 的东西可以让我将任何可执行文件或游戏的进程转移到其他计算机或服务器最大限度地减少我的计算机的处理器消耗。

谢谢。

【问题讨论】:

  • 如果办公室里的每个人都同时玩扫雷,你会称之为负载均衡吗?
  • 不,我指的是使用其他人的处理能力来运行扫雷,而我自己的处理能力很少。
  • 终端服务器、远程桌面或 VNC 怎么样?
  • 我将通过我的服务器运行它。

标签: c++ parallel-processing cluster-computing distributed-computing


【解决方案1】:

一切皆有可能,但这需要大量的工作,并且几乎肯定会使您的程序变得非常缓慢(我在这里说的是数百万或数十亿的因子)。本质上,您需要确保程序中使用的每一层都允许这样做。所以你必须重写操作系统才能做到这一点,而且还需要重写它使用的很多库。

为什么?假设您想将实际线程分布在不同的机器上。如果它是实际过程,会稍微容易一些,但我会惊讶于许多应用程序都是这样工作的。

首先,您需要同步内存,更具体地说,同步所有非线程本地存储,这通常意味着“所有内存”,因为并非所有语言都有线程感知内存模型。当然,这可以优化,例如缓冲所有内容,直到您遇到“原子”读取或写入,如果您的系统当然有这样的概念。现在你能想象当一个线程必须被锁定/解锁或一个原子变量必须被读取/写入时,每个线程都会阻塞几秒钟以进行同步吗?

接下来是与管理设备相关的问题。假设您需要一个网络连接:哪个设备将启动它,如何选择 ip,...?要无缝解决这个问题,您可能需要一个在所有平台之间共享的虚拟设备。这必须发生在网络设备、文件系统、打印机、监视器……。正如您提到的游戏:这也应该发生在 GPU 上,想象一下这将如何影响仅从 GPU 发送数据或向 GPU 发送数据的性能(提示:即使 16xpci-e 通常已经是一个瓶颈)。

结论:这是不可行的,如果你想要一个集群应用程序,你必须从头开始将它构建到应用程序中。

【讨论】:

  • 没有原子概念,我打算用我周围的其他电脑在我的电脑上运行一个游戏。
  • @user1509326:多线程应用程序会有一些你无法绕过的同步变量(锁、原子、信号……)。在多台机器上无缝复制 cpu 工作几乎是不可能的。你能做的最好的事情是挂钩 DirectX 或 OpenGL 并将这些调用分发到其他机器,但即使这样也会导致你的性能通常下降(我在我的硕士论文中做了这个实验,那是关于将游戏卸载到网络服务器)。
  • 当然,您始终可以在一台计算机(仍然是一台)上运行游戏,并使用 nx 或 vnc 或类似技术从另一台计算机上查看和控制它。但通常这些技术在开箱即用的游戏中效果不佳(屏幕频繁更换),因此您需要大量带宽,并且通常还需要大量额外的处理能力来对服务器上的流进行编码。
【解决方案2】:

我相信你能做的最接近的事情是MapReduce:这是一个范式,有望很快成为官方 boost 库的一部分。但是,我认为您不会想将它应用到像游戏这样的实时应用程序中。

相关问题可能会提供更多答案:https://stackoverflow.com/questions/2168558/is-there-anything-like-hadoop-in-c

但正如 KillianDS 指出的那样,没有automagical 方法可以做到这一点,似乎也没有可行的方法来做到这一点。那么您要解决的具体问题是什么?

【讨论】:

  • Map 和 reduce 操作已在 OpenMP 库中用于 C++ 数十年。 Google 使用的版本只是解决问题的众多可能方法中的一种,尤其对于需要及时响应的游戏(例如游戏)来说不是一个好方法。
【解决方案3】:

目前的研究状态是研究如何将进程的工作分配到一台计算机上的多个 CPU 内核上。在这种情况下,这些处理器仍然共享 RAM。这是必不可少的:RAM 延迟以纳秒为单位。

在分布式计算中,远程内存访问可能需要数十甚至数百微秒。分布式算法明确地考虑到了这一点。再多的魔法也无法让它消失:光本身很慢。

【讨论】:

    【解决方案4】:

    AT&T 贝尔实验室的Plan 9 OS 以最无缝和透明的方式支持分布式计算。计划 9 旨在将 Unix 将工作分解为互操作小任务的想法,由高度专业化的实用程序执行,“一切都是文件”以及客户端/服务器模型,达到一个全新的水平。它有一个 CPU 服务器的想法,它为功能较弱的网络客户端执行计算。不幸的是,这个想法过于雄心勃勃,远远超出了它的时代,Plan 9 在很大程度上仍然是一个研究项目。不过,它仍在作为开源软件开发。

    MOSIX 是另一个分布式操作系统项目,它在多台机器上提供单个进程空间并支持透明的进程迁移。它允许进程在不更改其源代码的情况下变得可迁移,因为所有上下文保存和恢复都是由操作系统内核完成的。 MOSIX 模型有多种实现方式 - MOSIX2、openMosix(自 2008 年起停产)和 LinuxPMI(openMosix 项目的延续)。

    ScaleMP 是另一种商业单系统映像 (SSI) 实现,主要针对数据处理和高性能计算。它不仅提供集群节点之间的透明迁移,还提供模拟共享内存(称为分布式共享内存)。基本上,它将通过非常快速的网络连接的一堆计算机转换为具有许多 CPU 和大量内存的单个大型 NUMA 机器。

    这些都不允许您在 PC 上启动游戏并将其透明地迁移并在网络上的某个位置执行。此外,大多数游戏都是 GPU 密集型而不是 CPU 密集型——大多数游戏甚至还没有利用多核 CPU 的全部计算能力。我们这里有一个 ScaleMP 集群,但它不能很好地运行 Quake...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多