如果您打算编写一个计算量很大的并行应用程序,那么您将使用什么准则来设计对象(无论是类还是结构,还是其他任何东西),以最大限度地发挥从并行性中获得最大收益的潜力。
我正在考虑一个应用程序,它解释/编译一个类似于树的图形对象,这些对象需要创建东西,将它传递给另一个要处理的对象,等等,具有树状结构。
从早期的设计过程中应该考虑什么?
答案 0 :(得分:6)
如果您可以使用大量不可变数据结构,那将为您节省大量时间,打字和头痛。
答案 1 :(得分:3)
如果您正在创建内容然后将其传递给处理,那么几乎可以肯定您可以设计应用程序以使用message passing和对象隔离。
第一步将确定责任,即确定谁将处理什么。每个被盒子围绕的人。
第二步将定义你的盒子之间的信息流,也就是说,如果A产生X ......谁消耗它?
在这两个步骤之后,您将拥有一个简单图表,其中叶子代表工人,箭头代表消息。每个箭头代表依赖顺序(即,如果是箭头从A到B然后A需要在B)之前执行。
通过这种方式,您将能够轻松地查看哪些操作可以并行执行,哪些操作确实是顺序的,图形易于查看,易于显示。
然后只需实施一个Pipe结构,让你在工作人员之间传递消息,这样每个工作人员都有一个工作流程。
最后说明:一旦原始设计完成,重构它就相对容易,以便改进。例如,进行相同工作的节点可以共享工作PIPES,以便8语法分析器从“lexic token”管道中消耗,或者更改它以便工人可以从其他工作管道“窃取”工作等。
答案 2 :(得分:1)
JorgeCórdoba描述的模式只是一种方法。以下绝对值得一读:
http://www.amazon.com/Patterns-Parallel-Programming-Software/dp/0321228111
这在很大程度上取决于您的数据之间的依赖关系以及分解问题的最佳方式。例如,如果您的问题适合于晒黑和接近,那么像Master-Worker和单程序多数据(SPMD)这样的模式往往是非常简单的方法。