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 <csnata...@gmail.com>
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....@sun.com>
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.