如何在MPI中实现extract_if函数

时间:2018-11-17 18:56:45

标签: c++ mpi

我试图用C ++写一个MPI函数,该函数仅接受向量中满足某些条件的那些元素,然后将它们输出到另一个向量。输入序列必须与输出序列一样均匀地分布在所有处理器上。该函数采用MPI_Comm commstd::vector<T>& instd::vector<T>& outPred pred作为参数。我不太确定采取哪种最佳方法。

1 个答案:

答案 0 :(得分:0)

您需要形成缓冲区并根据情况填充缓冲区。然后,根据您想要的传输类型,可以使用MPI_Send / MPI_IsendMPI_Recv / MPI_Irecv的阻塞/非阻塞版本您传递的comm

如果您需要更多信息,则需要提供有关确切要实现的目标的更多信息。输入和输出矢量是否已经分布在各个等级上?或者输入和输出向量是函数的输入和输出。 pred到底是什么?您希望所有人员都调用此函数吗?您的情况取决于什么?

更新:

#include <vector> 
#include <mpi.h> 
template <typename T, typename Pred> 
void mpi_extract_if(MPI_Comm comm, const std::vector<T>& in, std::vector<T>& out, Pred pred) 
{ 
int x = MPI_Comm_size(comm, &x);
//Use pred to fill a buffer
auto *buf;
pred(&in,&buf);
// Fill with appropriate sizes, vectors and buffers.
MPI_Scatterv(const void *sendbuf, const int *sendcounts, const int *displs,
             MPI_Datatype sendtype, void *out, int recvcount,
             MPI_Datatype recvtype,
             int root, MPI_Comm comm);

//MPI_Scatter(in.data(), x/in.size(), MPI_BYTE, out, x/in.size(), MPI_BYTE, 0, comm); 
}