-1

我是一名生物学家,我正在尝试学习计算机语言。但是,当我尝试了解lpthread库时,结果似乎很奇怪,因为结果低于顺序版本。

事实上,我仍在阅读 Tanenbaum 的书。但我的主要重点是学习计算 RNA 二级结构的基础知识。所以我在一本书中找到了对 nussinov 算法的解释,并确实实现了它。但是当我尝试制作一个并行版本时,我相信我可能错过了重点,因为这是我第一次接触并行实现。

我的问题是:

1. 我应该如何为这个算法实现数据并行版本?

2. 为什么我的实现比顺序的稍慢?

该代码可在:https ://gist.github.com/drenge/6395472 (每个文件是不同的版本并行/顺序)

4

1 回答 1

0

有两种方法可以制作算法/程序的并行版本。

  1. 你研究算法并编写串行程序。之后,您开始分析程序以查看在哪里可以获得速度增益。这些是并行性可能派上用场的地方(可能,不会)。我把这种方法称为“亡命之徒”。这种方法很有用(!),但大多数时候,下面的方法可以提供更好的性能增益。这种做优化方法的方式只考虑了编程和用户体验。

  2. 您采用该算法并尝试找出另一个允许并行处理问题的算法。算法中是否有独立的计算或步骤,是否有部分算法可以在其他部分完全完成之前完成,......这可以称为“理论方法”。请记住,每个线程都有其开销,并且您不希望开销大于您希望获得的收益。

实际上,将两者结合起来是最好的方法(如果确实需要并行性):首先专注于方法 2(优化算法,使其在科学上保持正确,但可以在多线程中处理)。然后查看关键线程(可以在分析时找到)并开始优化该线程。

正如 Kerrek SB 已经说过的:并行编程是一个非常复杂的话题,有很多可能的陷阱。在路的尽头,你应该问自己:是否值得付出努力。毕竟:为了获得几分钟而浪费几周的学习和编程时间是不值得的。

另一方面,如果您的程序将运行数千次,由于等待时间长或缺乏响应能力而让用户感到沮丧,那么制作一个性能更高的版本可能会很有用。但是再一次:您不能通过优化顺序版本而没有并行混乱来达到相同的目标吗?许多算法的顺序为 O(exp(x)) 或更差,可以简化为 O(x) 甚至 O(log(x))。

亲切的问候,PB

于 2013-08-31T21:04:23.340 回答