boost :: mpi :: send() 호출을 사용하여 ABC라는 사용자 정의 구조체를 보내려고합니다.boost mpi를 사용하여 사용자 정의 구조체를 전달하는 방법
주어진 구조체는 런타임에 크기가 결정되는 벡터 "데이터"를 포함합니다. 구조체 ABC의 객체는 마스터에 의해 슬레이브로 전송됩니다. 그러나 슬레이브는 벡터 "데이터"의 크기를 알아야만이 데이터를 수신하기에 충분한 버퍼를 슬레이브에서 사용할 수 있습니다. 구조체 ABC의 객체를 받기 전에 먼저 크기를 전송하고 슬레이브에 충분한 버퍼를 초기화하여 해결할 수 있습니다. 그러나 이는 STL 컨테이너를 사용하는 모든 목적을 저지합니다.
누구든지이 문제를 처리하는 더 좋은 방법을 알고 있습니까? 어떤 제안이라도 대단히 감사하겠습니다.
다음은 내 프로그램의 의도를 설명하는 샘플 코드입니다. 이 코드는 위에서 언급 한 이유 때문에 런타임에 실패합니다. 수신기는 그 내용을 필요로
는struct ABC
{
double cur_stock_price;
double strike_price;
double risk_free_rate;
double option_price;
std::vector <char> data;
};
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize (Archive &ar,
struct ABC &abc,
unsigned int version)
{
ar & abc.cur_stock_price;
ar & abc.strike_price;
ar & abc.risk_free_rate;
ar & abc.option_price;
ar & bopr.data;
}
}
}
BOOST_IS_MPI_DATATYPE (ABC);
int main(int argc, char* argv[])
{
mpi::environment env (argc, argv);
mpi::communicator world;
if (world.rank() == 0)
{
ABC abc_obj;
abc.cur_stock_price = 1.0;
abc.strike_price = 5.0;
abc.risk_free_rate = 2.5;
abc.option_price = 3.0;
abc_obj.data.push_back ('a');
abc_obj.data.push_back ('b');
world.send (1, ANY_TAG, abc_obj;);
std::cout << "Rank 0 OK!" << std::endl;
}
else if (world.rank() == 1)
{
ABC abc_obj;
// Fails here because abc_obj is not big enough
world.recv (0,ANY_TAG, abc_obj;);
std::cout << "Rank 1 OK!" << std::endl;
for (int i = 0; i < abc_obj;.data.size(); i++)
std::cout << i << "=" << abc_obj.data[i] << std::endl;
}
MPI_Finalize();
return 0;
}
응답 주셔서 감사합니다. 부스트는 벡터 활성화의 이점을 추가합니다. 현재 내가 추천 한 것과 비슷한 것을 사용하고 있습니다. 하지만 최적화되지 않았습니다. 부스트 직렬화 및 MPI 라이브러리를 사용하여 어떤 식 으로든 최적화 할 수 있는지 알고 싶습니다. – lava
"최적화되지 않음"이란 무엇을 의미합니까? 어떤 부분을 최적화하고 싶습니까? 어떤면에서 어떻습니까? – suszterpatt
보낼 수있는 데이터의 양은 수신 버퍼의 크기에 의해 제한됩니다. 그것을 피하기 위해, 나는 버퍼를 동일하게 할당 할 수 있도록 보내는 데이터의 크기를 보내야합니다. 두 가지 제한을 없애는 방법이 있는지 알고 싶습니다. – lava