15 #include "tml/message/packed_message.h"
33 MPI_Send(data,ndata,GetType(*data),dest,tag,m_comm);
48 MPI_Recv(data,ndata,GetType(*data),source,tag,m_comm,&m_status);
63 template <
typename T,
typename P>
66 MPI_Sendrecv(send_data,send_count,GetType(*send_data),dest,tag,recv_data,recv_count,GetType(*recv_data),source,tag,m_comm,&m_status);
79 MPI_Send(&data,1,GetType(data),dest,tag,m_comm);
94 MPI_Recv(&data,1,GetType(data),source,tag,m_comm,&m_status);
96 template <
typename T,
typename P>
109 MPI_Sendrecv(&send_data,1,GetType(send_data),dest,tag,&recv_data,1,GetType(recv_data),source,tag,m_comm,&m_status);
119 template <
typename T>
122 int data_size=data.size();
125 typename T::value_type *buffer=
new typename T::value_type[data_size];
130 for(
typename T::const_iterator iter=data.begin();
133 void* buf=
reinterpret_cast<void*
>(&(buffer[count]));
134 new(buf)(
typename T::value_type)(*iter);
144 send(data_size,dest,tag);
162 template <
typename T>
170 typename T::value_type *buffer=
new typename T::value_type[data_size];
175 for(
int i=0;i<data_size;i++){
176 data.insert(data.end(),buffer[i]);
191 template <
typename T,
typename P>
194 int send_count=send_data.size();
198 typename T::value_type *send_buffer=
new typename T::value_type[send_count];
202 for(
typename T::const_iterator iter=send_data.begin();
203 iter!=send_data.end();
205 void* buf=
reinterpret_cast<void*
>(&(send_buffer[count]));
206 new(buf)(
typename T::value_type)(*iter);
211 sendrecv(send_count,recv_count,dest,source,tag);
213 if(source==MPI_PROC_NULL){
218 typename T::value_type *recv_buffer=
new typename T::value_type[recv_count];
221 sendrecv_array(send_buffer,send_count,recv_buffer,recv_count,dest,source,tag+1024);
224 for(
int i=0;i<recv_count;i++){
225 recv_data.insert(recv_data.end(),recv_buffer[i]);
228 delete [] send_buffer;
229 delete [] recv_buffer;
240 template <
typename T>
243 int send_count=data.size();
247 typename T::value_type *send_buffer=
new typename T::value_type[send_count];
251 for(
typename T::const_iterator iter=data.begin();
254 void* buf=
reinterpret_cast<void*
>(&(send_buffer[count]));
255 new(buf)(
typename T::value_type)(*iter);
260 sendrecv(send_count,recv_count,dest,source,tag);
262 if(source==MPI_PROC_NULL){
267 typename T::value_type *recv_buffer=
new typename T::value_type[recv_count];
270 sendrecv_array(send_buffer,send_count,recv_buffer,recv_count,dest,source,tag+1024);
273 data.erase(data.begin(),data.end());
275 for(
int i=0;i<recv_count;i++){
276 data.insert(data.end(),recv_buffer[i]);
280 delete [] send_buffer;
281 delete [] recv_buffer;
293 template <
typename T>
297 int nb_data=data.size();
301 for(
typename T::const_iterator iter=data.begin();
308 send(msg->size(),dest,tag);
311 send_array(msg->buffer(),msg->size(),dest,tag+1024);
325 template <
typename T>
343 for(
int i=0;i<nb_data;i++){
344 typename T::value_type tv;
346 data.insert(data.end(),tv);
361 template <
typename T,
typename P>
366 int send_nb_data=send_data.size();
371 send_msg->pack(send_nb_data);
373 for(
typename T::const_iterator iter=send_data.begin();
374 iter!=send_data.end();
376 send_msg->pack(*iter);
378 send_msg_size=send_msg->size();
381 sendrecv(send_msg_size,recv_msg_size,dest,source,tag);
383 if(source==MPI_PROC_NULL){
391 sendrecv_array(send_msg->buffer(),send_msg_size,recv_msg->buffer(),recv_msg_size,dest,source,tag+1024);
393 if(source!=MPI_PROC_NULL){
395 recv_nb_data=recv_msg->
pop_int();
398 typename T::value_type tv;
399 for(
int i=0;i<recv_nb_data;i++){
400 recv_msg->unpack(tv);
401 recv_data.insert(recv_data.end(),tv);
417 template <
typename T>
422 int send_nb_data=data.size();
427 send_msg->pack(send_nb_data);
429 for(
typename T::const_iterator iter=data.begin();
432 send_msg->pack(*iter);
434 send_msg_size=send_msg->size();
437 sendrecv(send_msg_size,recv_msg_size,dest,source,tag);
439 if(source==MPI_PROC_NULL){
447 sendrecv_array(send_msg->buffer(),send_msg_size,recv_msg->buffer(),recv_msg_size,dest,source,tag+1024);
450 recv_nb_data=recv_msg->
pop_int();
453 data.erase(data.begin(),data.end());
454 for(
int i=0;i<recv_nb_data;i++){
455 typename T::value_type tv;
456 recv_msg->unpack(tv);
457 data.insert(data.end(),tv);