2014-12-03 38 views
0

原始程序有大约100个“公司”对象,它们在比较他们自己的属性和相邻公司的属性之后计算整数“价格”。是否可以“并行”这个程序?

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

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

问题:

它实际上是可以并行这一方案,当每个企业都需要等待前面的公司计算的信息,才可以计算自己的信息?

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

+4

我们需要查看算法以评论它是否可以并行化。 – 2014-12-03 07:44:55

+0

价格是否取决于相邻企业(和实际企业)的价格? – Jarod42 2014-12-03 07:55:07

+0

计算公司价值时可以独立于其他公司计算密集型部分吗? – 2014-12-03 07:55:54

回答

0

这不 - 在所有 - 有什么关系多线程技术,多线程的使用,当你算法需要它,请注意,这里的关键词是算法。

编程语言最终只是语言,算法以及思考和设计算法的方式决定了我们如何获得理想的结果。

因此,要回答你的问题,从信息我现在所拥有的关于你的情况(近似0%),我只能说这是不可能的逻辑你描述它做你想做什么。

有一种可能的解决办法,它使每个节点都有初始值(如firm [0]),甚至可以使算法变得更智能一些,并设计某种数学函数来输出初始数据从以前在同一个/以前的公司中使用的数据,但我认为这会毁了整个算法!所以也许你应该考虑重新设计整个算法数学因为你的代码工作正常,你有数据测试!

我唯一担心的是您的公司正在为大型机解决方案(或者我认为它应该是云解决方案)提供服务,以便百万的可能用户,但尚未考虑雇用项目分析团队将通过该算法并尝试在将其传递给编程团队以实施之前将其修复以适应所需的场景!

UPDATE

既然你与N个节点工作作为企业,你能想到的创建N个线程(我。e:每个节点一个)和一个主要的从每个线程收集信息,但这并不意味着它是一个多线程解决方案(逻辑上,因为主进程几乎总是空闲/等待数据) ,但从另一个角度来看,每个节点进程都可以将其数据提交给主进程并重新开始工作,主进程将是等待进程号为i的数据的进程(0 <和N)。

+0

这是一个大学项目/练习,所以不要担心'服务'方面的问题。 尽管我没有多说这个算法(因为它真的很大),但我相信我已经将问题归结为基本点 - 这是否合乎逻辑。 这正是我需要的,谢谢!我只是想在宣布“不可能”之前确定。 – 3932695 2014-12-03 08:08:40

+0

好的,那么答案应该是*在考虑代码之前操纵算法本身*。 – Ash 2014-12-03 08:09:58

+0

查看编辑,也许它可以帮助。 – Ash 2014-12-03 08:14:58

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]取决于对T + 1点的值[I],因而没有选项进行并行化。

相关问题