Как использовать задачу (или, возможно, раздел) для чтения больших данных при обработке данных - PullRequest
0 голосов
/ 03 июня 2019

Как видно из приведенного ниже кода, время чтения больших данных будет поглощать большую часть общего процессорного времени. На мой взгляд, должен быть какой-то способ эффективно повысить эффективность чтения данных. Например, когда один поток читает данные, другие потоки могут одновременно выполнять некоторую обработку данных.

Я пытался использовать 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  
...