我是一名生物学家,我正在尝试学习计算机语言。但是,当我尝试了解 lpthread 库时,这似乎很奇怪,因为结果低于顺序版本。
事实上,我仍在阅读 Tanenbaum 的书。但我的主要重点是学习 RNA 二级结构计算的基础知识。于是我在一本书上找到了nussinov算法的解释,并确实实现了它。但是当我尝试制作并行版本时,我相信我可能错过了重点,因为这是我第一次接触并行实现。
我的问题是:
<强>1。我应该如何实现该算法的数据并行版本?
<强>2。为什么我的实现比顺序的稍微慢一些?
代码可在: https://gist.github.com/drenge/6395472 上找到。 (每个文件是不同版本的并行/顺序)
最佳答案
有两种方法可以制作算法/程序的并行版本。
你研究算法并编写串行程序。然后,您开始分析程序,看看可以在哪里获得速度增益。这些是并行性可能派上用场的地方(可能,而不是意愿)。我把这种方法称为“绝望者的工具”。此方法很有用(!),但大多数时候,下面的方法可以提供更好的性能增益。这种优化方法只考虑了编程和用户体验。
您采用该算法并尝试找出允许并行处理问题的其他算法。算法中是否有独立的计算或步骤,算法中是否有部分可以在其他部分完全完成之前完成,......这可以称为“理论方法”。请记住,每个线程都有其开销,并且您不希望开销大于您希望获得的 yield 。
事实上,两者的结合是最好的方法(如果确实需要并行性):首先专注于方法 2(优化算法,使其保持科学上的正确性,但可以在多线程中处理)。然后查看关键线程(可以在分析时找到)并开始优化该线程。
正如 Kerrek SB 已经说过的那样:并行编程是一个非常复杂的主题,有很多可能的陷阱。在路的尽头,你应该问自己:这值得付出努力吗?毕竟:为了获得几分钟而浪费几周的学习和编程时间是不值得的。
另一方面,如果您的程序将运行数千次,由于等待时间过长或缺乏响应能力而使用户感到沮丧,那么制作一个性能更高的版本毕竟可能会很有用。但同样:通过优化顺序版本而不产生并行困惑,难道不能达到相同的目标吗?很多算法的数量级为 O(exp(x)) 或更差,并且可以减少到 O(x) 甚至 O(log(x))。
亲切的问候, PB
关于c - 努西诺夫平行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543324/