2016-06-02 4 views
1

루트 프로세스에서 값을 브로드 캐스트하고 다른 모든 프로세스에서 값을 수신하려고합니다. 필자는 다음 두 가지 형식으로 구현했습니다.부스트 mpi 방송 기능을 효율적으로 사용하는 방법은 무엇입니까?

if (world.rank() == 0) { 
    value = "Hello, World!"; 
    broadcast(world, value, 0); 
    } 
    else { 
    world.recv(boost::mpi::any_source, boost::mpi::any_tag, value); 
    } 

둘 것 다음과 같이 1. 나는 전화가 다른 프로세스로부터받는 동안

#include <boost/mpi.hpp> 
#include <iostream> 
#include <boost/serialization/string.hpp> 
namespace mpi = boost::mpi; 

int main(int argc, char* argv[]) 
{ 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 

    std::string value; 
    if (world.rank() == 0) { 
    value = "Hello, World!"; 
    } 
    broadcast(world, value, 0); 

    std::cout << "Process #" << world.rank() << " says " << value << std::endl; 
    return 0; 
} 

2. 나는 단지 루트에서 방송 호출 방송 모든 프로세스의 기능 (루트 및 다른 모든 노예를) 사용 이 예제에서 비슷하게 작동하지만 코드 효율성과 성능면에서 어떤 선호도가 있는지 알고 싶습니다.

감사합니다.

답변

1

일반 broadcast을 사용하십시오.

두 번째 버전은 올바른 MPI 프로그램이 아닙니다. 그것이 효과가 있다면, 우연에 의해서입니다. 일반적으로 broadcast 및 기타 집단은 고도로 최적화되어 있으며 시스템 토폴로지 정보를 활용할 수 있습니다. 따라서 이들은 point-to-point 메시지를 사용하여 직접 구현하는 것보다 효과적입니다. 또한 그들은 더 추상적 인 방식으로 의사 소통 구조를 표현하므로 코드를보다 명확하게 만듭니다.