原始程序有大约100个“公司”对象,在将自己的属性与相邻公司的属性进行比较后,计算整数“价格”。
公司之间的关系可以是“循环的”。在某些时候,公司[99]将需要来自公司[98]和公司[0]的信息来产生价格。在查看公司[99]和公司[1]之后,公司[0]会自我更新。
该计划目前需要大约一分半钟才能完成。我们正在尝试使该计划适应超级计算机,以便它可以在相似的时间内处理数百万家公司。因此,我们需要并行化该程序以在多个处理器上工作。
问题:
当每个公司需要等待前一家公司计算信息才能计算出自己的信息时,是否真的可以并行化该程序?
我的直觉和经验说这是不可能的,但多线程编程对我来说是一个新的领域,我以前对聪明的设计感到惊讶。
答案 0 :(得分: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值,因此没有并行化的选项。
答案 1 :(得分:0)
这根本没有 - 与多线程技术有关,当你的算法需要它时会使用多线程,请注意这里的关键词是算法。
编程语言最终只是语言,算法以及思考和设计算法的方式定义了我们如何获得理想的结果。
所以回答你的问题,从我现在掌握的关于你的情况的信息(差不多0%),我只能说出来了。不可能逻辑和你描述来做你想做的事。
有一种可能的解决方法,即使每个节点都具有初始值(如firm [0]),你甚至可以使算法更聪明一些,并设计某种数学函数来输出初始数据以前在同一个/以前的公司使用的数据,但我认为这会破坏整个算法!所以也许你应该考虑重新设计整个算法数学,因为你的代码工作正常,你有数据要测试!
我唯一担心的是你的公司正在提供大型机解决方案(或者我认为它应该是云解决方案),为百万的可能用户提供服务,但还没有#39 ;考虑聘请一个项目分析团队来完成算法并尝试修复它以适应所要求的场景,然后再将其传递给编程团队进行实施!!
<强>更新强>
由于您正在使用N个节点作为公司,您可以考虑创建N个线程(即:每个节点一个)和一个将从每个线程收集信息的主线程,现在这并不意味着它是一个多线程解决方案(逻辑上主要进程几乎一直都是空闲/等待数据),但从另一个角度来看,每个节点进程可以将其数据提交给主进程并重新开始工作,主进程将是等待来自进程号i的数据的那个(0