Fortran OpenMP将任务卸载到英特尔麦克风

Fortran OpenMP将任务卸载到英特尔麦克风,fortran,openmp,xeon-phi,offloading,Fortran,Openmp,Xeon Phi,Offloading,我正试图将我的程序中一个昂贵的循环卸载到Intel 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

我正试图将我的程序中一个昂贵的循环卸载到Intel 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,我不知道 原因是我将阵列映射到麦克风。我是 混淆了
的顺序$omp目标地图/$omp目标
指令 尊重
$omp并行
1。在一些例子中,我在互联网上看到, 人们在平行区域之外使用第一个目标指令,但是 也可以在并行区域内使用target(例如,请参见:)

另一件事,麦克风是否可能保留某些阵列的值 与sigma_const一样,clase(在模拟过程中不会改变)使
我不需要在每个模拟时间步传输它们?

您的嵌套看起来是正确的。您有一个在设备上执行的代码块(
目标
区域),其中有一个
并行
区域。反过来,将在主机上启动一个并行区域,每个主机线程启动一个设备区域(我想这不是您想要的)。您可以使用
target data
在设备上创建数据区域,并在其中包含多个
target
区域。设备上的数据将持续存在,
target update
可在必要时用于主机和设备之间的同步。英特尔站点上的代码使用主机并行区域启动系统中协处理器数量相同的线程,然后从每个主机线程生成一个设备区域。这允许多个独立的
target
区域并行执行,这不能仅使用单个线程来完成(因为OpenMP仍然不支持设备构造的异步执行)。因此,在本例中,并行构造之前的一个目标足以在MIC上执行整个并行区域?谢谢。您的嵌套看起来是正确的。您有一个在设备上执行的代码块(
目标
区域),其中有一个
并行
区域。反过来,将在主机上启动一个并行区域,每个主机线程启动一个设备区域(我想这不是您想要的)。您可以使用
target data
在设备上创建数据区域,并在其中包含多个
target
区域。设备上的数据将持续存在,
target update
可在必要时用于主机和设备之间的同步。英特尔站点上的代码使用主机并行区域启动系统中协处理器数量相同的线程,然后从每个主机线程生成一个设备区域。这允许多个独立的
target
区域并行执行,这不能仅使用单个线程来完成(因为OpenMP仍然不支持设备构造的异步执行)。因此,在本例中,并行构造之前的一个目标足以在MIC上执行整个并行区域?谢谢