并行编程模型:任务池、SIMD 计算与数据分布
1. 任务池与生产者 - 消费者模型
在并行编程中,任务池和生产者 - 消费者模型是两种重要的执行模式。
1.1 任务池
任务池是线程可访问的公共数据结构,线程从中检索任务进行执行。在处理任务时,线程可生成新任务并插入任务池。为避免竞态条件,对任务池的访问必须同步。当任务池为空且每个线程都完成了最后一个任务的处理时,并行程序的执行结束。
任务池提供了灵活的执行方案,尤其适用于自适应和不规则应用程序,因为在程序启动时,这些应用程序的计算任务并不固定。由于使用固定数量的线程,线程创建的开销与问题规模和要处理的任务数量无关。任务可以在程序执行的任何时刻动态生成,确保了灵活性。
任务池的数据结构可以由使用的编程环境提供,也可以包含在并行程序中。例如,Java 的 Executor 接口就是前者的一个例子。对于细粒度任务,任务的检索和插入开销变得重要,因此应使用复杂的数据结构来实现。
1.2 生产者 - 消费者模型
生产者 - 消费者模型区分生产者线程和消费者线程。生产者线程生成数据,供消费者线程作为输入使用。为了在生产者线程和消费者线程之间传输数据,使用一个公共的数据结构,通常是固定长度的数据缓冲区,两种线程都可以访问该缓冲区。
生产者线程将生成的数据元素存储到缓冲区中,消费者线程从缓冲区中检索数据元素进行进一步处理。生产者线程只有在缓冲区未满时才能存储数据元素,消费者线程只有在缓冲区不为空时才能检索数据元素。因此,必须使用同步机制来确保生产者和消费者线程之间的正确协调。
超级会员免费看
订阅专栏 解锁全文
20

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



