collective write with 1 dimension being global

Mark P Cheeseman mark.cheeseman at kaust.edu.sa
Thu Mar 17 21:39:13 CDT 2011


Hi,

The attached program seems to do what I want.  I am currently traveling back to KAUST from the US -arriving Saturday morning. I retest the write procedure on our BG/p on Saturday/Sunday.

Thanks for the quick response -it's greatly appreciated.

Best Regards,
Mark


Sent from my iPhone

On Mar 17, 2011, at 3:55 PM, "Wei-keng Liao" <wkliao at ece.northwestern.edu> wrote:

> Hi, Mark,
> 
> Based on your I/O description, I wrote this simple program.
> The first half creates a file, write a 4D array, and closes the file.
> The second part opens the file and read it back using the same partitioning setting.
> Please let us know if this is similar to your I/O requests.
> I tested it and data seems OK.
> 
> <4d.f90>
> 
> 
> Wei-keng
> 
> On Mar 17, 2011, at 4:22 PM, Rob Latham wrote:
> 
>> ok, i'm having a hard time mentally visualizing 4d, so let me make
>> sure I have a good understanding of the 3d version of this problem:
>> 
>> - Face-wise decomposition should work fine
>> - Splitting up the big 3d cube into N smaller cubes should work fine
>> (at least, that's a workload we've seen many times: there would be a
>> lot of bug reports if it did not)
>> 
>> - The problem, though is when one dimension is the same for all
>> processors.  in 3d space, that would mean... that all the sub-cubes end
>> up jammed against one face?  
>> 
>> If there's an (offset, count) tuple that's the same for every process,
>> then I guess that means the decomposition overlaps.  For writes,
>> overlapping decompositions result in undefined behavior.  For reads,
>> overlapping decompositions should just get sorted out in the MPI-IO
>> layer. 
>> 
>> If that's the crux of your problem, I can verify with a test case.
>> Let me know if I understand your application correctly.
>> 
>> ==rob
>> 
>> On Thu, Mar 10, 2011 at 05:08:39PM +0300, Nicholas K Allsopp wrote:
>>> Hi Rob,
>>> 
>>> Below is the section of code which Mark is describing.
>>> 
>>> Thanks
>>> Nick
>>> 
>>>     use param, only: f_now, nv
>>>     use comms, only: die
>>>     implicit none
>>> 
>>>     integer :: status, ncid, varID
>>>     integer(kind=MPI_OFFSET_KIND) :: count(4), offset(4), tmp(1)
>>>     real(kind=8) :: tmp2(1)
>>>     real(kind=8), dimension(:,:,:,:), allocatable :: val
>>>     logical :: here=.false.
>>> 
>>>     status = nfmpi_open( cart_comm, "restart.nc", nf_nowrite, &
>>>                          MPI_INFO_NULL, ncid )
>>> 
>>>     status = nfmpi_inq_dimlen( ncid, 1, tmp(1) )
>>> 
>>>   ! Read in the initial model time
>>>   !------------------------------------------------------------------
>>>     status = nfmpi_get_att_double( ncid, nf_global, "Model_Time", &
>>>                                    tmp2(1) )
>>>     model_time = tmp2(1)
>>> 
>>>   ! Read in the initial ion distribution field
>>>   !------------------------------------------------------------------
>>>     count = (/nx_local,ny_local,nz_local,nv/)
>>>     offset(1) = global_start(1)
>>>     offset(2) = global_start(2)
>>>     offset(3) = global_start(3)
>>>     offset(4) = 1
>>> 
>>>     allocate( val(nx_local,ny_local,nz_local,nv) )
>>> 
>>>     status = nfmpi_inq_varid( ncid, "Ion_Distribution", varID )
>>>     status = nfmpi_get_vara_double_all( ncid, varID, offset, count, val )
>>>     f_now = 0.0d0
>>>     f_now( 1:nx_local,1:ny_local,1:nz_local,1:nv ) = val
>>>     deallocate( val )
>>> 
>>>     status = nfmpi_close( ncid )
>>>     return
>>> 
>>> 
>>> 
>>> On 3/10/11 5:00 PM, "Mark P Cheeseman" <mark.cheeseman at kaust.edu.sa> wrote:
>>> 
>>>> Hi Nick,
>>>> 
>>>> Could you please make a code snippet from the read_restart subroutine
>>>> in io.f90 source file for Rob? I do not have access to the KSL_Drift
>>>> source currently (I do not bring my laptop to purposely keep me from
>>>> doing work).
>>>> 
>>>> Thanks,
>>>> Mark
>>>> 
>>>> 
>>>> 
>>>> ---------- Forwarded message ----------
>>>> From: Rob Latham <robl at mcs.anl.gov>
>>>> Date: Wednesday, March 9, 2011
>>>> Subject: collective write with 1 dimension being global
>>>> To: Mark Cheeseman <mark.cheeseman at kaust.edu.sa>
>>>> Cc: parallel-netcdf at mcs.anl.gov
>>>> 
>>>> 
>>>> On Sun, Mar 06, 2011 at 01:47:27PM +0300, Mark Cheeseman wrote:
>>>>> Hello,
>>>>> 
>>>>> I have a 4D variable inside a NetCDF file that I wish to distribute over a
>>>>> number of MPI tasks.  The variable will be decomposed over the first 3
>>>>> dimensions but not the fouth (i.e. the fourth dimension is kept global for
>>>>> all MPI tasks). In other words:
>>>>> 
>>>>>              GLOBAL_FIELD[nx,ny,nz,nv]  ==>
>>>>> LOCAL_FIELD[nx_local,ny_local,nz_local,nv]
>>>>> 
>>>>> I am trying to achieve via a nfmpi_get_vara_double_all call but the data
>>>>> keeps getting corrupted.  I am sure that my offsets and local domain sizes
>>>>> are correct.  If I modify my code to read only a single 3D slice (i.e. along
>>>>> 1 point in the fourth dimension), the code and input data are correct.
>>>>> 
>>>>> Can parallel-netcdf handle a local dimension being equal to a global
>>>>> dimension?  Or should I be using another call?
>>>> 
>>>> Hi: sorry for the delay.  Several of us are on travel this week.
>>>> 
>>>> I think what you are trying to do is legal.
>>>> 
>>>> Do you have a test case you could share?  Does writing exhibit the
>>>> same bug?  Does the C interface (either reading or writing)?
>>>> 
>>>> ==rob
>>>> 
>>>> --
>>>> Rob Latham
>>>> Mathematics and Computer Science Division
>>>> Argonne National Lab, IL USA
>>>> 
>>>> 
>>> 
>> 
>> -- 
>> Rob Latham
>> Mathematics and Computer Science Division
>> Argonne National Lab, IL USA
>> 
> 


More information about the parallel-netcdf mailing list