c++ - 通用 MPI 代码

标签 c++ generics mpi

我想创建一个通用的 MPI 方法,比方说为特定对象创建一个 bcast。但我需要将原始类型转换为 MPI_Data 类型? 知道我该怎么做吗?

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

我需要为 int 使用 MPI_INT,为 double 使用 MPI_DOUBLE,... 所以我需要一种类型转换方法,我想创建一个数据类型枚举,它可以给我 MPI_datatypes,但它需要将类型作为输入参数传递。

有什么想法吗?

谢谢

最佳答案

您可以使用“类型特征”习惯用法来序列化通用对象 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), ...);
}

关于c++ - 通用 MPI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42490331/

相关文章:

c - 带有源列表的 MPI_Recv

c - MPI_Gather C 中的内存寻址

c - 我需要帮助将 C 代码转换为 MPI

c++ - 进入函数,但不进入 VS2017 的参数评估

c# - 当参数值作为接口(interface)传递时,如何解析泛型参数的类类型?

javascript - 在函数的@param 和@returns 中使用相同的泛型类型

c# - 值类型存储在 (C#) 泛型集合中的什么位置

c++ - C++的字校正库

c++ - 手动生成 mipmap

c++ - 奇怪的 std::map 行为