我正在尝试将程序中昂贵的循环卸载到英特尔 MIC。代码的一部分是:
!$omp target map(to:coor,sigma_const,clase) map(tofrom:ener1,ener2)
!$omp parallel private(i,j,fdummy1,k,l,fdummy2,fdummy3,fdummy4,fdummy5,dist)
!$omp do reduction(+:ener1)
do i=1,num_res-2
do j=i+2,num_res
fdummy1=coor(i,1,qk)-coor(j,1,qk)
fdummy2=coor(i,2,qk)-coor(j,2,qk)
fdummy3=coor(i,3,qk)-coor(j,3,qk)
dist=sqrt(fdummy1*fdummy1+fdummy2*fdummy2+fdummy3*fdummy3)
fdummy1=sigma_const(i,j)
write(6,*) 'fdum',fdummy1
k=clase(i)
l=clase(j)
fdummy2=fdummy1*fdummy1 ! 2
fdummy3=fdummy2*fdummy2 ! 4
fdummy4=fdummy2*fdummy3 ! 6
fdummy5=fdummy4*fdummy4 ! 12
fdummy1=fdummy5-fdummy4
ener1=ener1+eps_const(k,l)*fdummy1
enddo
enddo
!$omp end do
!$omp do reduction(+:ener2)
do i=1,num_res-1
fdummy1=coor(i,1,qk)-coor(i+1,1,qk)
fdummy2=coor(i,2,qk)-coor(i+1,2,qk)
fdummy3=coor(i,3,qk)-coor(i+1,3,qk)
dist=sqrt(fdummy1*fdummy1+fdummy2*fdummy2+fdummy3*fdummy3)
fdummy1=(dist-r_cero)
fdummy2=fdummy1*fdummy1
ener2=ener2+fdummy2
enddo
!$omp end do
!$omp end parallel
!$omp end target
当我打印出 sigma_const 数组的值时,我得到 0,我不知道原因,因为我将数组映射到 MIC。我对!$omp target map/!$omp target
指令的顺序感到困惑!$omp parallel
。在一些示例中,我在互联网上看到,人们在并行区域之外使用第一个目标指令,但他们也可以在并行区域内使用目标(例如,参见:https ://software.intel.com/en-us/forums/intel- visual-fortran-compiler-for-windows/topic/516606)。
另一件事,MIC 是否有可能保留一些数组的值,如 sigma_const,clase(在模拟过程中不会改变),这样我就不需要在每个模拟时间步传输它们?