并行计算中的任务分配、MapReduce与排序算法
1. 任务静态分配与负载平衡
在并行计算中,任务的合理分配对于提高性能至关重要。任务可以被划分为静态块并分配给不同的线程。例如,有两种静态分配方式:
- 方式(a):将任务划分为4个静态块,分配给4个线程。
- 方式(b):将任务划分为16个静态块,分配给4个线程。
方式(b)的工作分配更为公平,因为它包含更小且数量更多的块,这些块以轮询的方式分配给每个线程,使得线程之间的负载更加平衡。可以使用 schedule (static, 8) 子句来实现方式(b)的工作分配。虽然动态调度可能会实现更紧密的整体负载平衡,但分配迭代块给线程的开销可能比使用“足够好”的静态调度更不利。
在使用OpenMP调度子句或显式线程库实现类似行为时,建议测试几个不同的块大小值,以查看是否存在显著的性能差异,并选择在大多数潜在输入数据集情况下性能更好的块大小。同时,要考虑缓存行的大小,尽可能选择能让单个线程充分利用完整缓存行的块大小,特别是在需要更新数据时。
2. MapReduce作为通用并发模型
MapReduce框架广为人知的一个重要原因是,程序员无需深入了解并发编程就能使用它。可以编写一个MapReduce“引擎”,当给定映射操作如何应用于单个元素、归约操作如何应用于单个元素以及归约操作如何处理元素对的规范时,该引擎可以并发执行。对于程序员来说,这些只是处理一个或两个对象的串行函数,引擎会负责在并发线程之间划分计算任务。
例如,TBB的 parallel_reduce 算法就是一个例子,其中
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



