[Boost-users] mpi all reduce with std::vector and back_inserter

195 views
Skip to first unread message

Kraus Philipp

unread,
May 5, 2011, 6:08:39 PM5/5/11
to boost...@lists.boost.org
Hello,

I have a std::vector<std::string> vector at each CPU. I would like to
"reduce" all vectors on all CPUs. For example:

CPU 0: vec = [a, b, c, d]
CPU 1: vec = [e, f, g, h]

std::vector<std::string> myreduce;
mpi::all_reduce( mpi com object, vec, myreduce, #);

myreduce = [a, b, c, d, e, f, g, h]

How can I do this? Should I replace my # with a back_inserter of the
std::vector?

Thx for help

Phil
_______________________________________________
Boost-users mailing list
Boost...@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Júlio Hoffimann

unread,
May 5, 2011, 6:24:50 PM5/5/11
to boost...@lists.boost.org
Hi Kraus,

If i understood well, it's not the case for `all_reduce`, you need `all_gather` instead:


The vectors has the same size?

Regards,
Júlio.

2011/5/5 Kraus Philipp <philip...@flashpixx.de>

Kraus Philipp

unread,
May 5, 2011, 6:42:21 PM5/5/11
to boost...@lists.boost.org

Am 06.05.2011 um 00:24 schrieb Júlio Hoffimann:

Hi Kraus,

If i understood well, it's not the case for `all_reduce`, you need `all_gather` instead:


The vectors has the same size?

No, they have different sizes. I use all_gather, but I must iterate over each element in the result vector and put the elements into a new vector. I do this at the time:

std::vector< std::vector<std::string> > result;
mpi::all_gather( mpi object, vec, result);

std::vector<std::string> myvec;
foreach( result as res )
     myvec.push_back( foreach in res );

I need the loop after all_gather and my question is: Can I do the loop call into the mpi command, so that I don't have a loop after the gather?

Thx

Phil 

Júlio Hoffimann

unread,
May 5, 2011, 7:03:04 PM5/5/11
to boost...@lists.boost.org
Your first post referred to other implementation. Anyway, if you have two vectors of strings:

CPU 0: vec = [ a b c d e ]
CPU 1: vec = [ f g h i j ]

then all_gather will produce a vector of strings:

result = [ a b c d e f g h i j ]

If you have a vector<vector<string> >, then all_gather will produce vector<vector<string> > it's not possible to change this behavior.

You begin with a bidimensional vector, then you end with a bidimensional vector. I don't know if it's possible to concatenate the matrix lines with other Boost library, but the collective operations in Boost.MPI are like in the MPI 1.1 standard, nothing else.

Regards,
Júlio.

2011/5/5 Kraus Philipp <philip...@flashpixx.de>

Reply all
Reply to author
Forward
0 new messages