output intermediate results

General OpenMP discussion

output intermediate results

Postby lwxlee » Tue Nov 12, 2013 10:19 pm

Hi all,

I have a Fortran code and want to make it parallel. For ease of use, I selected OpenMP.
During the process, I want to dump some intermediate results to a txt file from each thread which is used to debug the code. The part of code relevant is like below:
Code: Select all
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(n_f,f,K0,K1,K2,M) &   
  !$OMP                   SCHEDULE(DYNAMIC,1)                                   
  do i=1,n_f
     !     angular frequency                                                   
     omega = 2.0_dpt*pit*f(i)
     !$ print*,'the frequency and angular freqency are ',f(i),omega             
     ! intialize                                                               
     SA = 0.0_dpt
     SB = 0.0_dpt                                                 
!     SA(1:sdof,1:sdof)               =   0.0_dpt                               
     SA(1:sdof,sdof+1:2*sdof)        =  -(K0 - omega**2*M)
     SA(sdof+1:2*sdof,1:sdof)        =  -(K0 - omega**2*M)
     SA(sdof+1:2*sdof,sdof+1:2*sdof) =  -K1                                                     
     SB(1:sdof,1:sdof)               =  -(K0 - omega**2*M)
!     SB(1:sdof,sdof+1:2*sdof)        =   0.0_dpt                               
!     SB(sdof+1:2*sdof,1:sdof)        =   0.0_dpt                               
     SB(sdof+1:2*sdof,sdof+1:2*sdof) =   K2
     !$ if (OMP_get_thread_num()==0) then                                       
     !$  call save_complex_data_2D('K0_thread1.out',K0)                         
     !$  print*,'size of K0 is ',shape(K0)                                     
     !$ end if                                                                 
     !$ if (OMP_get_thread_num()==1) then                                       
     !$    print*, 'size of K0 is ', shape(K0)                                 
     !$    call save_complex_data_2D('K0_thread2.out',K0)                       
     !$ endif
  enddo
!$OMP END PARALLEL DO


I created a subroutine as shown in the code to save the data. K0,K1,K2 and M are shared variables and they are only for reading.
The problem is that if I only use one loop and multiple threads, i.e., there are some threads idle, and then write the data to the .out file, I can get the right K0. However, when I tried to increase the outer loop size by using n_f >1 and let each thread busy, K0s of the dumped .out files become incorrect. Ideally, K0 should not change because they are only for read. I do not know what happened here. The sizes of the K0 of the dumped files are also different. Maybe this is a basic question but help is appreciated. Note that these save data subroutines work well for sequential code.

Regards
lwxlee
 
Posts: 2
Joined: Tue Nov 12, 2013 9:50 pm

Re: output intermediate results

Postby MarkB » Wed Nov 13, 2013 3:17 am

Hi there,

Does the code work correctly if you enclose the calls to the I/O routine in a CRITICAL construct?

Can you post the source code for save_complex_data_2D, please?
MarkB
 
Posts: 429
Joined: Thu Jan 08, 2009 10:12 am

Re: output intermediate results

Postby lwxlee » Wed Nov 13, 2013 3:06 pm

Thanks, Mark. It is a silly mistake. In the save data subroutine, the index for the file to be written is same. When I tried to dump the data, the two files conflict which led to the to problem I met.
lwxlee
 
Posts: 2
Joined: Tue Nov 12, 2013 9:50 pm


Return to Using OpenMP

Who is online

Users browsing this forum: Google [Bot], Yahoo [Bot] and 8 guests