我想创建一个通用的 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/