OpenMP中的嵌套循环优化

时间:2015-02-27 07:24:39

标签: fortran openmp

一旦应用openMP,我无法获得正确的输出结果,是否可以在任何地方正确使用?

!$OMP PARALLEL DO SHARED(outmtresult,inpa,inpb,dynindexlist) PRIVATE(i,j) REDUCTION(+:outcountb)

do i=1,size1  
  do j=1, size1
    outcountb = outcountb + 1
    outmtresult(j) = tan(inpa(j) + inpb(j)) + alpha1 + dynindexlist(i) 
  enddo
enddo

!$OMP END PARALLEL DO

1 个答案:

答案 0 :(得分:0)

只需交换你的循环,一切都会好的:

!$OMP PARALLEL DO SHARED(outmtresult,inpa,inpb,dynindexlist) PRIVATE(i,j) REDUCTION(+:outcountb)

do j=1,size1        ! <-- Swap i and
  do i=1, size1     !       j here
    outcountb = outcountb + 1
    outmtresult(j) = tan(inpa(j) + inpb(j)) + alpha1 + dynindexlist(i) 
  enddo
enddo

!$OMP END PARALLEL DO

在您的示例中,多个线程写入相同的内存地址outmtresult(j),因为您并行化do i循环。

通过交换循环,您可以并行do j并且不会写 在具有多个并发线程的同一目的地。