上面代码段使用循环分块技术创建了无循环迭代相关的循环m,并且预先计算出x[49]和y[49]的初值,这样就可以正确地将循环并行化了。因此,在并行化的过程中,必须仔细分析循环之间的数据相关性,通过改写程序来消除数据相关。
3.4 数据共享
在多线程程序中,确定哪些数据需要被共享,哪些数据为私有数据是非常重要的,这对程序的正确性有很大的影响。在使用OpenMP时,开发人员应该告诉编译器哪一片存储区域应当在多个线程间共享,哪一片区域应该保持私有。当某存储单元被标识为共享,那么所有线程都能够访问该单元。但是,如果某存储单元被标识为私有,那么每个线程都拥有该变量的一个副本,可以私有地访问。当循环退出执行后,这些私有副本将变成未定义状态。
OpenMP使用数据作用域子句来指定变量的共享属性,分别是shared、private、firstprivate和lastprivate。
(1)shared子句,显式地定义一个变量的作用域是共享的。
(2)private子句,显式地定义一个变量的作用域是私有的。
(3)firstprivate和lastprivate子句,分别对私有变量进行初始化操作和终结操作,firstprivate将串行的变量值复制到同名的私有变量中,且在每一个线程开始执行的时候初始化一次。而lastprivate则将并行执行中的最后一次循环的私有变量值复制到同名的串行变量中。
|