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