学习目标:
1.理解线程级并行的概念
2.了解一种线程级并行的编程接口
3.理解数据一致性的概念
4.了解原子指令对于解决一致性问题的作用
在之前的文章中我们已经简单介绍了前两点,这节我们重点介绍OpenMP中归约的操作。
通过DevC++中展示的代码段,我们可以观察到OpenMP的多个线程都可以访问同一个地址空间,因此变量sum对于各个线程来说是共享的,且各个线程更新sum的时机决定了sum的结果是否正确。
那么如何让各个线程得到“一致性”的数据呢?我们可以通过OpenMP中的归约操作(reduction)来指定某个变量是特定线程私有的,在并行处理结束后对这些变量进行归约运算,将运算后的结果返回主线程。
代码格式:#pragma omp for reduction(+ : sum)
归约操作的本质是求和运算,对各线程的私有sum进行求和后返回主线程。
学习小结:
线程级并行是继流水线并行、数据级并行后的另一种并行策略,可以挖掘硬件性能;OpenMp是一种在共享存储器系统上进行并行编程的方式,较为容易实现。此外我还了解到OpenMP有三种工作方式:静态方式、动态方式和任务并行方式,我们主要利用OpenMP的任务并行特点来实现归约操作。任务并行方式在实现上较为简单,可以充分利用多核处理器的计算能力。但我们也要知道,不同的工作方式适用于不同的应用场景。在选择合适的工作方式时,需要根据问题的性质、处理器的特性以及系统的负载情况等因素进行综合考虑。