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
谢谢!
答案 0 :(得分:2)
问题是desc_h1
中的module fourierin
指针。当您通过use fourierin
将模块置于范围内时,导致竞争条件的所有线程都可以访问desc_h1
。在desc_h1
变量列表中添加private
应该可以修复它。