1

プログラムの高価なループを 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 になります。配列を 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 (シミュレーション中に変更されない) のようないくつかの配列の値を保持する可能性があるので、各シミュレーション タイム ステップでそれらを転送する必要はありませんか?

4

0 に答える 0