【问题标题】:Is it possible to 'parallelize' this program?是否可以“并行化”该程序?
【发布时间】:2015-01-31 16:32:52
【问题描述】:

原始程序有大约 100 个“公司”对象,它们在将自己的属性与相邻公司的属性进行比较后计算一个整数“价格”。

公司之间的关系可以是“循环的”。在某些时候,公司[99] 将需要来自公司[98] 和公司[0] 的信息来产生价格。公司[0] 将在查看公司[99] 和公司[1] 后自行更新。

该程序目前大约需要一分半钟才能完成。我们正在尝试使该程序与超级计算机一起工作,以便它可以在类似的时间内处理数百万家公司。因此我们需要并行化这个程序以在多个处理器上工作。

问题:

当每个公司需要等待前一个公司计算信息才能计算自己的信息时,是否真的可以并行化这个程序?

我的直觉和经验表明这是不可能的,但多线程编程对我来说是一个新领域,我以前对巧妙的设计感到惊讶。

【问题讨论】:

  • 我们需要查看算法才能评论它是否可以并行化。
  • price 是否依赖于相邻公司(和实际公司)的price
  • 在计算公司价值时,是否有计算机密集型部分可以独立于其他公司来实现?
  • 你的意思是firm[99]在时间t的值取决于firm[98]在时间t-1的值还是取决于firm[98]在时间@的值987654328@ ?这是一个基本问题,你没有提到它令人担忧。你知道区别吗?

标签: c++ multithreading mpi


【解决方案1】:

通常,在前向时间演化算法中,就像您所描述的那样,所做的“近似”是 t+1 处所有元素的值仅取决于 t 处元素的值。示意图如下:

time |         elements
  t  | ... [i-1] [i] [i+1] ...
     |          \ | /
 t+1 | ...       [i]       ...

如果是这种情况,那么可以,您可以并行更新,因为它们是独立的。 最简单的方法是让每个线程(或其他类型的逻辑工作单元)更新集合的相等部分(因此将工作细分为 N 个部分)。

如果你当然想做这样的事情:

time |             elements
  t  | ... [i-1] [i] [i+1] [i+2] ...
_____|__________\_|_/__|___|________
     | ...       [i]   |   |     ...
 t+1 |               \  |  /
_____|_...____________[i+1]______...

那么你就不走运了,因为[i+1] 依赖于 [i] 的 t+1 值,因此没有并行化选项。

【讨论】:

    【解决方案2】:

    这与多线程技术没有任何关系,当您的算法需要时使用多线程,请注意这里的关键词是算法。

    编程语言归根结底只是语言,算法以及思考和设计算法的方式决定了我们将如何获得预期的结果。

    所以回答你的问题,根据我目前掌握的关于你的情况的信息(几乎是 0%),我只能说不可能合乎逻辑地,正如你描述的做你想做的事。

    对此有一个可能的解决方法,即让每个节点都有初始值(如公司 [0]),您甚至可以让算法更智能一点,并设计某种数学函数来输出初始数据以前在同一家/以前的公司中使用过数据,但我认为这会破坏整个算法!所以也许你应该考虑重新设计整个算法数学,因为你的代码运行良好并且你有数据可以测试!

    我唯一担心的是,贵公司正在提供大型机解决方案(或者我认为应该是云解决方案),为 百万 可能的用户提供服务,但还没有考虑雇用一个项目分析团队来检查算法并尝试对其进行修复以适应所要求的场景,然后再将其传递给编程团队进行实施!

    更新

    由于您将 N 个节点作为公司使用,您可以考虑创建 N 个线程(即:每个节点一个)和一个将从每个线程收集信息的主线程,现在这并不意味着它是一个多线程解决方案(逻辑上主进程几乎一直处于空闲/等待数据),但从另一个角度来看,每个节点进程都可以将其数据提交给主进程并重新开始工作,主进程将是一个等待来自进程号 i (0

    【讨论】:

    • 这是一个大学项目/练习,所以不用担心“服务”方面。虽然我没有对算法说太多(因为它真的很大),但我相信我已经把这个问题提炼到了本质——这就是它是否合乎逻辑的问题。这正是我需要的,谢谢!在宣布某事“不可能”之前,我只是想确定一下。
    • 好的,那么答案应该是在考虑代码之前操纵算法本身
    • 这个问题在逻辑上不是不可能的,不管歧义是如何产生的。但是,如果数据完全依赖,那么您基本上是在求解一个 100x100 带矩阵方程,其中带宽为 3(从对角线计算为 -1,0,+1)
    • 对他的数据有一个 100% 并行算法是不走运的,因为你可以看到每个节点 [i] 将等待来自 [i-1] 的数据,这意味着同时time 可以在主流程代码中进行一次实时操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2017-11-21
    相关资源
    最近更新 更多