2010-04-21 5 views
4

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; 
} 

답변

3

당신은 메시지의 vector 객체 자체를 보낼해야하며, vector의 내부 상태는 아마 어쨌든 유효하다 (메모리 주소를받은 후 엉망이 될 것입니다 송신 측에서 수신 측에서 유효하지 않을 수도 있음).

  1. 네 복식 간단한 문자 배열로 별도의 구조체를 정의

    대신, 아래 단계를 수행해야합니다.
  2. 보낼 때마다이 새 구조체의 임시 변수를 만들고 보낼 문자 vector의 내용으로 char 배열을 채 웁니다.
  3. 이 특정 struct 오브젝트의 크기와 일치하는 임시 MPI 데이터 유형을 정의하십시오.
  4. 임시 구조체를이 임시 데이터 형식의 인스턴스로 보냅니다.
  5. 적절하게 큰 수신 버퍼에서 수신하거나 미리 크기를 전송하십시오.
  6. char 배열의 내용을 기반으로 ABC 구조체를 재구성하십시오.

최소한 바닐라 C++ 및 MPI와 관련이 있습니다. 나는 부스트에 익숙하지 않기 때문에이 단계가 더 쉬워지는 지 모르겠습니다.

+0

응답 주셔서 감사합니다. 부스트는 벡터 활성화의 이점을 추가합니다. 현재 내가 추천 한 것과 비슷한 것을 사용하고 있습니다. 하지만 최적화되지 않았습니다. 부스트 직렬화 및 MPI 라이브러리를 사용하여 어떤 식 으로든 최적화 할 수 있는지 알고 싶습니다. – lava

+0

"최적화되지 않음"이란 무엇을 의미합니까? 어떤 부분을 최적화하고 싶습니까? 어떤면에서 어떻습니까? – suszterpatt

+0

보낼 수있는 데이터의 양은 수신 버퍼의 크기에 의해 제한됩니다. 그것을 피하기 위해, 나는 버퍼를 동일하게 할당 할 수 있도록 보내는 데이터의 크기를 보내야합니다. 두 가지 제한을 없애는 방법이 있는지 알고 싶습니다. – lava

0

BOOST_IS_MPI_DATATYPE고정 길이 데이터입니다. 배열이 고정 길이가 아니기 때문에 이것이 실패합니다.

+0

추신 : 단순히 매크로가있는 줄을 제거하면 작업이 시작됩니다. – baol

관련 문제