Matrix Fortran 90的并行化
我最近开始学习如何用Fortran并行化程序,现在我正试图将其包含在程序中 问题是,我正在使用Lapack(计算特征值和特征向量),这显然与并行化例程产生了冲突,因为它根据矩阵大小计算一些特征值(对于小尺寸,它的值是错误的,对于等于或大于10x10的矩阵,它根本不计算它们) 当我只使用一个线程运行程序时,它工作正常Matrix Fortran 90的并行化,matrix,parallel-processing,fortran,fortran90,Matrix,Parallel Processing,Fortran,Fortran90,我最近开始学习如何用Fortran并行化程序,现在我正试图将其包含在程序中 问题是,我正在使用Lapack(计算特征值和特征向量),这显然与并行化例程产生了冲突,因为它根据矩阵大小计算一些特征值(对于小尺寸,它的值是错误的,对于等于或大于10x10的矩阵,它根本不计算它们) 当我只使用一个线程运行程序时,它工作正常 program nuevo use omp_lib implicit none integer ::i,j,k,l,kk,jj,red,ok,info,LWORK,s
program nuevo
use omp_lib
implicit none
integer ::i,j,k,l,kk,jj,red,ok,info,LWORK,stat1
integer :: m,n,q,rea,i0,j0,CHUNK,CHUNKSIZE !!!! rea= number of realizations >1
PARAMETER(m=10,n=10,rea=12,LWORK=2*m*n,ok=m*n,CHUNKSIZE=rea/2)
complex*8 t,aa,tt,ww !! Caution with the dimension of the variables
INTEGER, DIMENSION(1):: SEED, OLD
integer, parameter :: ikind=selected_real_kind(p=15)
real (kind=ikind) :: pi
real ( kind = 8 ) wtime
real*8 D, DD(m,n),zz, X(2*m*n*rea), XX(m*n,2*rea), ss, hh, HARVEST(2*n*m*rea), w
complex*16 A(m*n,m*n), WORK(3*n-2,3*n-2)
real*8 RWORK(2*m*n), b(m*n), f
!!!!!!!!!!!!RANDOM NUMBERS!!!!!!!!!!!!!!!!!!!
SEED(1) = 67937
CALL RANDOM_SEED
CALL RANDOM_SEED(SIZE=k)
CALL RANDOM_SEED(GET=OLD(1:k))
CALL RANDOM_NUMBER(HARVEST)
X=HARVEST
!!!!!!!!!!!RANDOM MATRIX!!!!!!!!!!!!!!!!!!!!!!
XX=RESHAPE( X, (/ m*n, 2*rea /) )
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
wtime = omp_get_wtime ( )
!call omp_set_num_threads(1)
t=1.0d0 !! hoppings
CHUNK=CHUNKSIZE
!$OMP PARALLEL
!$OMP DO SCHEDULE(STATIC,CHUNK) ORDERED
do jj=0,2*(rea-1),2 !!for the realizations
w=0.1d0 !! desorder ratio
ww=n
q=m*n
aa=(0.0d0,1.0d0) !! Complex number
A=0d0
b=0d0
f=2/ww
do j=1,(m*n)
if (XX(j,jj+1)<0.5) then
ss=1.0d0
else
ss=-1.0d0
end if
A(j,j)=ss*0.5d0*w*XX(j,jj+2) !! Diagonal terms with slighty random modifications
end do
!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!! MATRIX !!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! In the x direction (i odd)
do i=1,m,2
do j=1,n-2,2
A((j*m)+i,((j+1)*m)+i)=t
end do
end do
!! In the x direction (i even)
do i=2,m,2
do j=1,n-1,2
A(((j-1)*m)+i,(j*m)+i)=t
end do
end do
!! In the y direction
do j=1,n
do i=1,m-1
A(((j-1)*m)+i,((j-1)*m)+i+1)=t*exp(pi*j*f*aa) !! phase factor due to the magnetic field
end do
end do
!! Periodic boundaries in x direction
do i=1,m,2
A(i,(i+m*n-m))=t
end do
!! Periodic boundaries in y direction
do j=1,n
A(((j-1)*m)+1,j*m)=t*(exp(-pi*j*f*aa))
end do
!!=========Conjugate===============
do i0=1,m*n
do j0=1,m*n
A(j0,i0)=dconjg(A(i0,j0))
end do
end do
call ZHEEV('V', 'U', ok, A, ok, b, WORK, LWORK, RWORK, info) !!Lapack routine
do i=1,m*n
write(*,*) b(i)
write(*,*) ' '
end do
end do !! for the realizations
!$OMP END DO
!$OMP END PARALLEL
end program nuevo
新潮节目
使用omp_库
隐式无
整数:i,j,k,l,kk,jj,red,ok,info,LWORK,stat1
整数::m,n,q,rea,i0,j0,CHUNK,CHUNKSIZE!!!!rea=实现数量>1
参数(m=10,n=10,rea=12,LWORK=2*m*n,ok=m*n,CHUNKSIZE=rea/2)
复杂*8吨,aa,tt,ww!!注意变量的尺寸
整数,维度(1)::种子,旧
整数,参数::ikind=所选的\u实际\u种类(p=15)
实数(种类=ikind)::π
实时(种类=8)wtime
实数*8d,DD(m,n),zz,X(2*m*n*rea),XX(m*n,2*rea),ss,hh,HARVEST(2*n*m*rea),w
复合体*16A(m*n,m*n),功(3*n-2,3*n-2)
实数*8 RWORK(2*m*n),b(m*n),f
!!!!!!!!!!!!随机数!!!!!!!!!!!!!!!!!!!
种子(1)=67937
称为随机种子
调用随机种子(大小=k)
调用随机种子(GET=OLD(1:k))
呼叫随机号码(收获)
X=收获
!!!!!!!!!!!随机矩阵!!!!!!!!!!!!!!!!!!!!!!
XX=重塑(X,(/m*n,2*rea/)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
wtime=omp\u get\u wtime()
!调用omp\u set\u num\u线程(1)
t=1.0d0!!跳跃
CHUNK=CHUNKSIZE
!$OMP并行
!$已订购OMP DO计划(静态、区块)
do jj=0,2*(rea-1),2!!为了实现
w=0.1d0!!解吸比
ww=n
q=m*n
aa=(0.0d0,1.0d0)!!复数
A=0d0
b=0d0
f=2/ww
do j=1,(m*n)
if(XX(j,jj+1)您最好在StackOverflow上问这个问题,但不要交叉张贴,mods可能会为您迁移它。在!$OMP PARALLEL
行中,您没有指定哪个变量是共享的,哪个是私有的。OpenMP采用默认行为,即每个变量都是共享的。我建议您使用!$OMP PARALLEL default(无)
这是OpenMP的“隐式无”,当您跟踪这样的错误时,它将为您节省大量时间。这是一个惊人的代码大杂烩…它非常不可读,有五种不同类型的浮点变量:特定精度的选定类型的实数,real(8)
,real*8
(不需要与前面的任何一个相同),complex*8
和complex*16
。这不需要进入变量名称。您需要稍微清理一下代码,尝试发布一个最小的、完整的、可验证的示例,以便其他人能够更有效地帮助您。