3.3 迭代相关
为了保证对一个循环进行正确的并行化操作,必须要保证数据两次循环之间不存在数据相关性,数据相关性又称为“数据竞争”,当两个线程对同一个变量进行操作,并且一个操作为写操作时,就说明这两个线程存在数据竞争。此时,读出的数据不一定就是前一次写操作的数据,而写入的数据也可能不是程序所需要的,为了将一个循环并行化,且不影响程序的正确性,需要仔细检查程序,使程序在并行化后,两个线程之间不能够出现数据竞争。 x[0]=0; y[0]=1; #pragma omp parallel for private(k) for(k=1;k<100;k++) { x[k]=y[k-1]+1; //S1 y[k]=x[k-1]+2; //S2 }
上面的代码中,循环k中S1对存储单元x[k]进行写操作,而k+1中S2读取该单元,这样就产生了数据相关,多线程代码将不能得到正确结果,要解决此问题可以将循环重写: x[0]=0; y[0]=1; x[49]=74; y[49]=74; #pragma omp parallel for private(k) for(m=0;m<2;m++) { for(k=m*49+1;k<m*50+50;k++) { x[k]=y[k-1]+1;S1 y[k]=x[k-1]+2;S2 } }
|