Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] MPI-Send for entire entire matrix when allocating memory dynamically
From: Eugene Loh (Eugene.Loh_at_[hidden])
Date: 2009-10-30 15:44:02


Wouldn't you need to create a different datatype for each matrix
instance? E.g., let's say you create twelve 5x5 matrices. Wouldn't you
need twelve different derived datatypes? I would think so because each
time you create a matrix, the footprint of that matrix in memory will
depend on the whims of malloc().

George Bosilca wrote:

> Even with the original way to create the matrices, one can use
> MPI_Create_type_struct to create an MPI datatype
> (http://web.mit.edu/course/13/13.715/OldFiles/build/mpich2-1.0.6p1/www/www3/MPI_Type_create_struct.html
> ) using MPI_BOTTOM as the original displacement.
>
> On Oct 29, 2009, at 15:31 , Justin Luitjens wrote:
>
>> Why not do something like this:
>>
>> double **A=new double*[N];
>> double *A_data new double [N*N];
>>
>> for(int i=0;i<N;i++)
>> A[i]=&A_data[i*N];
>>
>> This way you have contiguous data (in A_data) but can access it as a
>> 2D array using A[i][j].
>>
>> (I haven't compiled this but I know we represent our matrices this
>> way).
>>
>> On Thu, Oct 29, 2009 at 12:30 PM, Natarajan CS <csnataraj_at_[hidden]>
>> wrote:
>> Hi
>> thanks for the quick response. Yes, that is what I meant. I
>> thought there was no other way around what I am doing but It is
>> always good to ask a expert rather than assume!
>>
>> Cheers,
>>
>> C.S.N
>>
>>
>> On Thu, Oct 29, 2009 at 11:25 AM, Eugene Loh <Eugene.Loh_at_[hidden]>
>> wrote:
>> Natarajan CS wrote:
>>
>> Hello all,
>> Firstly, My apologies for a duplicate post in LAM/MPI list I
>> have the following simple MPI code. I was wondering if there was a
>> workaround for sending a dynamically allocated 2-D matrix? Currently
>> I can send the matrix row-by-row, however, since rows are not
>> contiguous I cannot send the entire matrix at once. I realize one
>> option is to change the malloc to act as one contiguous block but
>> can I keep the matrix definition as below and still send the entire
>> matrix in one go?
>>
>> You mean with one standard MPI call? I don't think so.
>>
>> In MPI, there is a notion of derived datatypes, but I'm not
>> convinced this is what you want. A derived datatype is basically a
>> static template of data and holes in memory. E.g., 3 bytes, then
>> skip 7 bytes, then another 2 bytes, then skip 500 bytes, then 1 last
>> byte. Something like that. Your 2d matrices differ in two
>> respects. One is that the pattern in memory is different for each
>> matrix you allocate. The other is that your matrix definition
>> includes pointer information that won't be the same in every
>> process's address space. I guess you could overcome the first
>> problem by changing alloc_matrix() to some fixed pattern in memory
>> for some r and c, but you'd still have pointer information in there
>> that you couldn't blindly copy from one process address space to
>> another.
>