2017-02-27 8 views
0

一般的なMPIメソッドを作成したいと思います。特定のオブジェクトのbcastを考えてみましょう。私はプリミティブ型をMPI_Data型に変換する必要がありますか? どのように私はそれを行うことができますか?私は、私は型変換メソッドが必要 ...、二重のために、int型のためMPI_DOUBLEをMPI_INTを使用する必要が一般的なMPIコード

template <typename T> 
void bcast_data(std::vector<T> vec) 
{ 
... 
} 

は、私は私にMPI_datatypesを与えることができるdataypesの列挙型を作成すると思ったが、それは通過が必要です入力引数としての型。

おかげ

+0

boost :: mpiを見てください。これは基本的にMPI用のC++ラッパーであり、まさにそのことです。 – OutOfBound

答えて

2

あなたは一般的なオブジェクトTをシリアル化するために、「型形質」イディオムを使用することができます。これにより、実装を変更せずに新しいタイプのサポートを追加できるという利点があります。

私が数年前に書きましたこのMPIラッパーを見てください:https://github.com/motonacciu/mpp

template <class T> 
struct mpi_type_traits { 
    typedef T element_type; 
    typedef T* element_addr_type; 

    static inline MPI_Datatype get_type(T&& raw); 
    static inline size_t get_size(T& raw); 
    static inline element_addr_type get_addr(T& raw); 
}; 

とコンクリートの型、例えばのための専門を提供:

は、次のようなタイプの特性を定義したいですstd::vector<T>次のように:

template <class T> 
struct mpi_type_traits<std::vector<T>> { 

    typedef T element_type; 
    typedef T* element_addr_type; 

    static inline size_t get_size(std::vector<T>& vec) { 
     return vec.size(); 
    } 

    static inline MPI_Datatype get_type(std::vector<T>&& vec) { 
     return mpi_type_traits<T>::get_type(T{}); 
    } 

    static inline element_addr_type get_addr(std::vector<T>& vec) { 
     return mpi_type_traits<T>::get_addr(vec.front()); 
    } 
}; 

をあなたがする必要がある最後の事は、例えば、あなたのMPIのメソッドを実装し、タイプの特性を使用することですMPI_Sendを呼び出すとき:

template <class T> 
void send(T &&value, ...) { 
    MPI_Send(mpi_type_traits<T>::get_addr(value), 
      mpi_type_traits<T>::get_size(value), 
      mpi_type_traits<T>::get_type(value), ...); 
} 
+1

偉大な答え。問題を招いているようなものは、実際のオブジェクトを使用して型情報を取得することです(例えば、 'vec.size()')。つまり、送信者と受信者が異なるオブジェクトを持つ場合、互換性のある型を作成する必要があります。例えば、受信者は、受信する前に、送信者のサイズを知り、それに応じてサイズを変更しなければならない。あなたの実装でこれをどうやって処理するのだろうか? – Zulan

+0

これはMPIの典型的な使用例とあまり変わりません。送信者と受信者は、送信されるオブジェクトの長さと種類を手前で知る必要があります。実際のオブジェクトの前に、オブジェクトの記述子(サイズと型情報を含む)が送られるプロトコルを設計することで、これを解決できます。 – simpel01

+0

私は一般的には同意しませんが、1) 'std :: vector'は、(' begin'、 'end'、' push_back'を通して)明示的にサイズを設定したり知ったりせずに使われます。サイズを取ることは、あなたのソリューションのユーザーには見えません。 2)Boost.MPIでは、実際には空のベクトルへの参照を渡して、それを受信することができます(かなりのパフォーマンスコスト)。 3) 'MPI_Probe'を使うと、サイズを知らずに追加のメッセージ/シリアライゼーションをせずにベクトルを受け取ることができます。私は、後者をサポートするC++抽象概念があるのだろうかと思います。 – Zulan

0

を、私はこのようなものを使用することが明らかになったいくつかのタイプを離れると、それは間違いなく完全な答えではありません。それは私の場合に有効です

​​3210