Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按值返回MPI_请求和MPI_状态对象是否危险? 我在C++中编写了一个MPI的轻型包装器。为了简化操作,我让一些函数返回一个MPI\u请求对象,而不是将其作为指针。该代码在我的计算机上运行良好,尽管我担心它可能会导致MPI的不同实现出现问题_C++_Parameters_Mpi - Fatal编程技术网

按值返回MPI_请求和MPI_状态对象是否危险? 我在C++中编写了一个MPI的轻型包装器。为了简化操作,我让一些函数返回一个MPI\u请求对象,而不是将其作为指针。该代码在我的计算机上运行良好,尽管我担心它可能会导致MPI的不同实现出现问题

按值返回MPI_请求和MPI_状态对象是否危险? 我在C++中编写了一个MPI的轻型包装器。为了简化操作,我让一些函数返回一个MPI\u请求对象,而不是将其作为指针。该代码在我的计算机上运行良好,尽管我担心它可能会导致MPI的不同实现出现问题,c++,parameters,mpi,C++,Parameters,Mpi,下面是一些示例代码: template<class T> MPI_Request ireceive(T* data, int count, int source, int tag) { MPI_Request request; MPI_Irecv(data, get_mpi_type<T>::mul * count, get_mpi_type<T>::type(), source, tag, MPI_COMM_WORLD, &reque

下面是一些示例代码:

template<class T> MPI_Request ireceive(T* data, int count, int source, int tag)
{
    MPI_Request request;
    MPI_Irecv(data, get_mpi_type<T>::mul * count, get_mpi_type<T>::type(), source, tag, MPI_COMM_WORLD, &request);
    return request;
}
template<class T> MPI_Request ireceive(std::vector<T>& dest, int source, int tag)
{
    MPI_Status status = probe(source, tag);
    int size = get_msg_size<T>(status);
    dest.clear();
    dest.resize(size);
    return ireceive(&dest[0], size, source, tag, status);
}
MPI_Status wait(MPI_Request& request)
{
    MPI_Status status;
    MPI_Wait(&request, &status);
    return status;
}
MPI_Status test(MPI_Request& request, int& flag)
{
    MPI_Status status;
    MPI_Test(&request, &flag, &status);
    return status;
}
模板MPI\U请求ireceive(T*数据、int计数、int源、int标记)
{
MPI_请求;
MPI_Irecv(数据、获取MPI_类型::mul*计数、获取MPI_类型::类型()、源、标记、MPI_通信世界和请求);
返回请求;
}
模板MPI_请求ireceive(std::vector&dest,int-source,int-tag)
{
MPI_状态=探头(源、标签);
int size=获取消息大小(状态);
目标清除();
目的地调整大小(大小);
返回ireceive(&dest[0]、大小、源、标记、状态);
}
MPI_状态等待(MPI_请求和请求)
{
MPI_状态;
MPI_等待(&请求,&状态);
返回状态;
}
MPI_状态测试(MPI_请求和请求、int和标志)
{
MPI_状态;
MPI_测试(请求、标志和状态);
返回状态;
}
前两个函数直接返回MPI_请求对象,后两个函数返回MPI_状态对象。我担心,在另一个MPI实现中,这些函数可能会导致未定义的行为

按值返回MPI\u请求和MPI\u状态对象是否危险?

按值返回MPI_请求和MPI_状态对象是否危险

它可能会导致错误,如本文所述

它会影响性能吗


这些结构不应该大到足以降低性能,但一般来说,当选择通过引用传递时,应该遵循它。

MPI_Status
结构基本上是一个整数数组,它报告特定通信的结果,无论是点对点接收还是非阻塞操作。复制此结构并不危险,您可以使用赋值或
memcpy
进行复制。复制这些元素的性能损失应该不是问题,因为这些元素的典型大小约为20字节(MPI 3.1)

另一方面,
MPI\u请求
并非微不足道。我还为项目做了一些C++的MPI包装(因为C++ API被禁止,并且在实现过程中不一致)。代码>MPI_请求结构基本上是用于检查操作完成状态的句柄(将其视为指针)。如果释放句柄(因为非阻塞操作已完成,或者因为调用了
MPI\u请求\u free
MPI\u Cancel
),则对象不再有效,
MPI\u请求
句柄设置为
MPI\u请求\u NULL

根据我的经验,
MPI\u请求
包装类最好不可复制。您仍然可以使用引用或指针共享它们。这将节省一些调试时间

见MPI标准文件3.1,第3.7节非阻塞通信

如果请求标识的操作已完成,则调用
MPI_TEST
返回
flag=true
。在这种情况下,状态对象被设置为包含有关已完成操作的信息。如果请求是活动的持久性请求,则将其标记为非活动。任何其他类型的请求被解除分配且请求句柄设置为
MPI\u request\u NULL
[…]

允许使用null或非活动请求参数调用
MPI_TEST
。在这种情况下,操作返回
flag=true
且状态为空


注意:空或非活动请求<强>不是无效的请求句柄,例如,是释放<代码> MPIIORIGION/CODE >的结果,只将其中一个拷贝设置为<代码> MPIIRealestuxNULLUT//> >豪尔赫,是具有C++特性的MPIIORIQUE对象,还是C++结构?_请求?这使用复制构造函数返回数据。因此,如果它正常工作,就不会有危险。我假设结构的大小相当小,复制不会对性能产生太大影响。MPI_请求为POD,MPI_状态为POD。如果MPI实现(库),则可以安全地复制它们使用结构中的数据,而不是结构的地址(检查MPI标准,检查几种流行的MPI实现)。实际上复制
MPI\u请求
会产生错误。