Florian Lindner
2018-02-14 10:19:00 UTC
Hello,
I have this example code:
#include <vector>
#include <mpi.h>
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
{
MPI_Request req1, req2;
std::vector<int> vec = {1, 2, 3};
int packSize = sizeof(int) * vec.size();
int position = 0;
std::vector<char> packSendBuf(packSize);
int vecSize = vec.size();
MPI_Pack(vec.data(), vec.size(), MPI_INT, packSendBuf.data(), packSize, &position, MPI_COMM_WORLD);
int estimatedPackSize = 0;
MPI_Pack_size(vec.size(), MPI_INT, MPI_COMM_WORLD, &estimatedPackSize);
std::cout << "packSize = " << packSize << ", estimatedPackSize = " << estimatedPackSize << std::endl;
MPI_Isend(&vecSize, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &req1);
MPI_Isend(packSendBuf.data(), position, MPI_PACKED, 0, 0, MPI_COMM_WORLD, &req2);
}
{
int vecSize, msgSize;
int packSize = 0, position = 0;
MPI_Recv(&vecSize, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Status status;
MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_PACKED, &packSize);
char packBuffer[packSize];
std::cout << "packSize from get_count = " << packSize << std::endl;
std::vector<int> vec(vecSize);
MPI_Recv(packBuffer, packSize, MPI_PACKED, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Unpack(packBuffer, vecSize, &position, vec.data(), vecSize, MPI_INT, MPI_COMM_WORLD);
}
MPI_Finalize();
}
Which gives an MPI_ERR_TRUNCATE even when running on 1 rank only. Background is that I want to send multiple differently
sized objects, also with more complex types that to not map to MPI_*, for which I plan to use MPI_BYTES. I plan to pack
them into one stream and unpack them one after one.
I suspect I got somthig with the sizes wrong. The lines
int estimatedPackSize = 0;
MPI_Pack_size(vec.size(), MPI_INT, MPI_COMM_WORLD, &estimatedPackSize);
std::cout << "packSize = " << packSize << ", estimatedPackSize = " << estimatedPackSize << std::endl;
Return the same number, that is 12, the packSize from get_cont is also 12.
Could you give a hint, what the is problem is here?
OpenMPI 3.0.0 @ Arch or OpenMPI 1.1.0.2 @ Ubuntu 16.04
Thanks,
Florian
I have this example code:
#include <vector>
#include <mpi.h>
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
{
MPI_Request req1, req2;
std::vector<int> vec = {1, 2, 3};
int packSize = sizeof(int) * vec.size();
int position = 0;
std::vector<char> packSendBuf(packSize);
int vecSize = vec.size();
MPI_Pack(vec.data(), vec.size(), MPI_INT, packSendBuf.data(), packSize, &position, MPI_COMM_WORLD);
int estimatedPackSize = 0;
MPI_Pack_size(vec.size(), MPI_INT, MPI_COMM_WORLD, &estimatedPackSize);
std::cout << "packSize = " << packSize << ", estimatedPackSize = " << estimatedPackSize << std::endl;
MPI_Isend(&vecSize, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &req1);
MPI_Isend(packSendBuf.data(), position, MPI_PACKED, 0, 0, MPI_COMM_WORLD, &req2);
}
{
int vecSize, msgSize;
int packSize = 0, position = 0;
MPI_Recv(&vecSize, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Status status;
MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_PACKED, &packSize);
char packBuffer[packSize];
std::cout << "packSize from get_count = " << packSize << std::endl;
std::vector<int> vec(vecSize);
MPI_Recv(packBuffer, packSize, MPI_PACKED, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Unpack(packBuffer, vecSize, &position, vec.data(), vecSize, MPI_INT, MPI_COMM_WORLD);
}
MPI_Finalize();
}
Which gives an MPI_ERR_TRUNCATE even when running on 1 rank only. Background is that I want to send multiple differently
sized objects, also with more complex types that to not map to MPI_*, for which I plan to use MPI_BYTES. I plan to pack
them into one stream and unpack them one after one.
I suspect I got somthig with the sizes wrong. The lines
int estimatedPackSize = 0;
MPI_Pack_size(vec.size(), MPI_INT, MPI_COMM_WORLD, &estimatedPackSize);
std::cout << "packSize = " << packSize << ", estimatedPackSize = " << estimatedPackSize << std::endl;
Return the same number, that is 12, the packSize from get_cont is also 12.
Could you give a hint, what the is problem is here?
OpenMPI 3.0.0 @ Arch or OpenMPI 1.1.0.2 @ Ubuntu 16.04
Thanks,
Florian