Matrix Fortran 90的并行化

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

我最近开始学习如何用Fortran并行化程序,现在我正试图将其包含在程序中

问题是,我正在使用Lapack(计算特征值和特征向量),这显然与并行化例程产生了冲突,因为它根据矩阵大小计算一些特征值(对于小尺寸,它的值是错误的,对于等于或大于10x10的矩阵,它根本不计算它们)

当我只使用一个线程运行程序时,它工作正常

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
。这不需要进入变量名称。您需要稍微清理一下代码,尝试发布一个最小的、完整的、可验证的示例,以便其他人能够更有效地帮助您。