c - 努西诺夫平行

标签 c parallel-processing pthreads bioinformatics

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

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

我的问题是:

<强>1。我应该如何实现该算法的数据并行版本?

<强>2。为什么我的实现比顺序的稍微慢一些?

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

最佳答案

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

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

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

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

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

另一方面,如果您的程序将运行数千次,由于等待时间过长或缺乏响应能力而使用户感到沮丧,那么制作一个性能更高的版本毕竟可能会很有用。但同样:通过优化顺序版本而不产生并行困惑,难道不能达到相同的目标吗?很多算法的数量级为 O(exp(x)) 或更差,并且可以减少到 O(x) 甚至 O(log(x))。

亲切的问候, PB

关于c - 努西诺夫平行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18543324/

相关文章:

c - epoll接收返回值

c++ - 打破循环循环

scala - 使用 ScalaMeter 测试并行操作的性能

czmq 多个 zactor 实例崩溃

c - 如何在c中创建定时器线程

c - Feige Fiat Shamir 计划不起作用

c++ - C 简单 RingBuffer - 多线程 - 查找关键部分

c - 如何使用 libpqtype 从插入返回 id

c# - "Infinite"异步并行foreach循环

c - 我是否被迫使用 pthread_cond_broadcast(通过 pthread_cond_signal)以保证 *my* 线程被唤醒?