Hey guys.
I'm a beginner of Open MPI.
When I wanted to send some std::pair onjects from a node to another, I found out the fact that there are no Datatype of std::pair.
You can use only the datatypes in Open MPI as bellow.
MPI Datatype | C++ Datatype |
---|---|
MPI::CHAR | char |
MPI::SHORT | signed short |
MPI::INT | signed int |
MPI::LONG | signed long |
MPI::LONG_LONG | signed long long |
MPI::SIGNED_CHAR | signed char |
MPI::UNSIGNED_CHAR | unsigned char |
MPI::UNSIGNED_SHORT | unsigned short |
MPI::UNSIGNED | unsigned int |
MPI::UNSIGNED_LONG | unsigned long int |
MPI::UNSIGNED_LONG_LONG | unsigned long long |
MPI::FLOAT | float |
MPI::DOUBLE | double |
MPI::LONG_DOUBLE | long double |
MPI::BOOL | bool |
MPI::COMPLEX | Complex |
MPI::DOUBLE_COMPLEX | Complex |
MPI::LONG_DOUBLE_COMPLEX | Complex |
MPI::WCHAR | wchar_t |
MPI::BYTE | |
MPI::PACKED |
You can see only basic types and it's natural to do so because developers use variety of custom types and Open MPI can't prepare for all types of them.
I think the most flexible one is MPI::BYTE.
So, I used it to send std::pair.
You can easly calculate the total size of pairs in 1 byte increments by using the "sizeof" function.
Here is the example code.
#include "mpi.h"
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char **argv) {
int rank, numprocs;
int namelen;
vector<pair<int, int>> send_buf = {make_pair(0, 1), make_pair(2, 3)};
vector<pair<int, int>> recv_buf(2);
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
if(rank == 0){
MPI_Send((void*)send_buf.data(), sizeof(pair<int,int>)*2, MPI_BYTE, 1, 0, MPI_COMM_WORLD);
}
if(rank == 1){
MPI_Recv((void*)recv_buf.data(), sizeof(pair<int,int>)*2, MPI_BYTE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
cout << recv_buf[0].first << ":" << recv_buf[0].second << endl;
cout << recv_buf[1].first << ":" << recv_buf[1].second << endl;
}
MPI_Finalize();
return 0;
}
Enjoy hacking!
Top comments (0)