0

从下面的代码可以看出,读取大数据的时间会吃掉总CPU时间的很大一部分。在我看来,应该有一些方法可以有效地提高数据读取的效率。例如,当一个线程正在读取数据时,其他线程可以同时进行一些数据处理。

我曾尝试使用 OpenMP 来提高数据处理的效率(第二部分),但需要进一步的帮助来找出进一步优化第一部分(任务或部分)的方法。

- - - - - - - -更新 - - - - - - - - - - - -

在现阶段,我不想做多次读/写,这可能是通过MPI(MPI_FILE_WRITE_ALL)实现的。我所期望的如下:一个线程读取下一个时间步的数据,而其他线程可以通过使用任务或部分构造来完成当前时间步的其余工作。在这个方向上的任何建议。

Program main
  Implicit none  
  Integer i,j,k, Count, rl
  Integer, Parameter :: Nxt=961, Nyt=526, Nzt=100

  Integer OMP_GET_THREAD_NUM,  TID, OMP_GET_NUM_THREADS,  NTHREADS
  Real(4), Dimension(Nxt,Nyt,Nzt)      :: Ui, Vi, Wi, Pi
  Real(4), Dimension(Nxt*4,Nyt,Nzt)    :: Utotal       
  real*8:: start, finish, OMP_GET_WTIME
  Character(len=50) :: filename  

  call OMP_SET_NUM_THREADS(6)
!---------=====OpenMP Number Threads=======------------
!$OMP PARALLEL PRIVATE(NTHREADS, TID)
!$  TID = OMP_GET_THREAD_NUM()
! Only master thread does this
!$ IF (TID .EQ. 0) THEN
!$  NTHREADS = OMP_GET_NUM_THREADS()
!$ PRINT *, 'Number of threads = ', NTHREADS
!$ END IF
!$OMP END PARALLEL

 Do ii = 200000, 700000, 20  

  1912 format('../../../volume7/20_40/WI_Inst3Dsub_UVWP',I7.7)
  1913 format('../../../volume8/40_60/WI_Inst3Dsub_UVWP',I7.7)
  1914 format('../../../volume5/60_70/WI_Inst3Dsub_UVWP',I7.7)

  if(ii .le. 400000) Write(filename,1912) ii
  if(ii .gt. 400000) Write(filename,1913) ii
  if(ii .ge. 600000) Write(filename,1914) ii    

!$ start=OMP_GET_WTIME()       
!---------Part 1---------------  
  inquire(iolength=rl) Utotal(:,:,:)

  OPEN(10,FILE=trim(filename)//".dat",FORM='UNFORMATTED',&
          ACCESS='DIRECT', RECL=rl, STATUS='OLD')
      !,CONVERT='big_endian'
      COUNT = 1; READ(10,REC=COUNT) Utotal(:,:,:)
  CLOSE(10)

!---------Part 2 --------------- 
!$OMP PARALLEL DO PRIVATE(i,j,k) SHARED(Ui,Vi,Wi,Pi)
  DO k = 1, Nzt   
  DO j = 1, Nyt   
  DO i = 1, Nxt
    Ui(i,j,k) = Utotal(i+Nxt*0,j,k)
    Vi(i,j,k) = Utotal(i+Nxt*1,j,k)
    Wi(i,j,k) = Utotal(i+Nxt*2,j,k)
    Pi(i,j,k) = Utotal(i+Nxt*3,j,k)
  END DO; End Do; End Do
!$OMP END PARALLEL DO

!$ finish=OMP_GET_WTIME()
!$ Write(*,*) ii,'Time cost per step', finish-start   

! THERE ARE ALSO OTHER WOKRS

 End DO 

 End program  
4

0 回答 0