我试图用C ++写一个MPI函数,该函数仅接受向量中满足某些条件的那些元素,然后将它们输出到另一个向量。输入序列必须与输出序列一样均匀地分布在所有处理器上。该函数采用MPI_Comm comm
,std::vector<T>& in
,std::vector<T>& out
和Pred pred
作为参数。我不太确定采取哪种最佳方法。
答案 0 :(得分:0)
您需要形成缓冲区并根据情况填充缓冲区。然后,根据您想要的传输类型,可以使用MPI_Send
/ MPI_Isend
和MPI_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);
}