我正在尝试使用OpenMP中的任务实现并行算法.并行编程模式基于生产者 - 消费者的想法,但由于消费者流程比生产者慢,我想使用一些生产者和几个消费者.主要思想是创建与生产者一样多的OS线程,然后每个线程创建要并行完成的任务(由消费者完成).每个生产者都将与相应数量的消费者(即numCheckers/numSeekers)相关联.我在英特尔双芯片服务器上运行该算法,每个芯片有6个内核.问题在于,当我只使用一个生产者(寻求者)和越来越多的消费者(检查员)时,随着消费者数量的增长,性能衰退得很快(见下表),即使正确的核心数量在100%.另一方面,如果我增加生产者的数量,平均时间减少或至少保持稳定,即使消费者数量成比例.在我看来,所有的改进都是通过生产者之间的输入划分来实现的,而且任务只是烦恼.但同样,我对一个生产者的行为没有任何解释.我在OpenMP-Task逻辑中遗漏了什么?难道我做错了什么?
-------------------------------------------------------------------------
| producers | consumers | time |
-------------------------------------------------------------------------
| 1 | 1 | 0.642935 |
| 1 | 2 | 3.004023 |
| 1 | 3 | 5.332524 |
| 1 | 4 | 7.222009 |
| 1 | 5 | 9.472093 |
| 1 | 6 | 10.372389 |
| 1 | 7 | 12.671839 |
| 1 | 8 | 14.631013 |
| 1 | 9 | 14.500603 |
| 1 | 10 | …Run Code Online (Sandbox Code Playgroud)