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