OpenMP与trigonmetric转换MKL

时间:2014-08-06 09:24:30

标签: fortran openmp intel-fortran intel-mkl

 subroutine born_par(iconj)    !.false.=0, .true.=1
 use maxwell
 use fourierin
 implicit none
 real*8:: zkx,zky,zkz,zsx,zsy,zsz,zwx,zwy,zwz,ztim,second
 complex*16:: z,zak,zakx,zaky,zakz,zb,zg
 integer, intent(in):: iconj
 integer :: ik,im1,in1,il1,im2,in2,il2,ix,iy,iz

 real*8:: bx(0:mm+2),by(0:nn+2),bz(0:ll+2)
 bx=.0
 by=.0
 bz=.0


im1 = mm+1
in1 = nn+1
il1 = ll+1
im2 = mm+2
in2 = nn+2
il2 = ll+2


do ik = 1,3
print *,'1'
!$omp parallel   private(iy,iz,bx,by) shared(ll,nn,mm,b,im1)
!$omp do
do iz = 1,ll
 do iy = 1,nn
    bx=.0
    by=.0
    bx(1:mm)=real(b(1:mm,iy,iz,ik))       
    by(1:mm)= aimag(b(1:mm,iy,iz,ik))  
    call dst_fwd(im1,bx(0:im1))             
    call dst_fwd(im1,by(0:im1))
    b(1:mm,iy,iz,ik) =cmplx( bx(1:mm),by(1:mm))
  enddo
enddo
!$omp end do
!$omp end parallel
enddo
return
end subroutine born_par

当我在两个循环周围放置OpenMP命令以便并行计算正弦变换(子程序dst_fwd)时,上面的代码片段在运行时崩溃而没有错误消息。我正在使用ifort编译器和MKL英特尔库进行离散正弦变换。

有没有人可以给我一个提示可能导致程序崩溃的提示?

以下代码定义了模块fourierin和子程序dst_fwd

 include 'mkl_dfti.f90'
 include 'mkl_trig_transforms.f90'
 module fourierin
 use mkl_dfti
 use mkl_trig_transforms

 implicit none

  type(DFTI_DESCRIPTOR),pointer:: desc_h1


 contains

subroutine dst_fwd(n,f)
 implicit none
 integer:: n,istr,tt_type ,ipar(128),ir
integer,dimension(2):: istride
real*8:: scale, dpar(3*n/2+2),f(n+1)



f=f(1:n)*(n/2.0d0)


tt_type = MKL_SINE_TRANSFORM

call d_init_trig_transform(n,tt_type,ipar,dpar,ir)
if (ir.ne.0)then
  print *,'Error init fwd sine transform st'
stop
endif

call d_commit_trig_transform(f,desc_h1,ipar,dpar,ir)
if (ir.ne.0)then
  print *, 'Error COMMIT sine transform st'
stop
endif

call  d_forward_trig_transform (f,desc_h1,ipar,dpar,ir)
if (ir.ne.0)then
  print *, 'Error FORWARD  sine transform  st'
 stop
endif

call free_trig_transform(desc_h1,ipar,ir);
if (ir.ne.0)then
  print *,'Error free fwd sine transform '
  stop
 endif

end subroutine

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是desc_h1中的module fourierin指针。当您通过use fourierin将模块置于范围内时,导致竞争条件的所有线程都可以访问desc_h1。在desc_h1变量列表中添加private应该可以修复它。