當使用序列化數據執行具有相同標記的多個isend/irecv傳輸時,我看到MPI_ERR_TRUNCATE
錯誤boost::mpi
。這些是而不是併發傳輸,即不涉及線程。在同一時間只有一個以上的轉帳。這裏有一個簡短的測試程序,展示失敗:boost :: mpi在具有相同標記的多個isend/irecv傳輸中拋出MPI_ERR_TRUNCATE
#include <iostream>
#include <string>
#include <vector>
#include <boost/mpi.hpp>
#include <boost/serialization/string.hpp>
static const size_t N = 2;
int main() {
boost::mpi::environment env;
boost::mpi::communicator world;
#if 1
// Serialized types fail.
typedef std::string DataType;
#define SEND_VALUE "how now brown cow"
#else
// Native MPI types succeed.
typedef int DataType;
#define SEND_VALUE 42
#endif
DataType out(SEND_VALUE);
std::vector<DataType> in(N);
std::vector<boost::mpi::request> sends;
std::vector<boost::mpi::request> recvs;
sends.reserve(N);
recvs.reserve(N);
std::cout << "Multiple transfers with different tags\n";
sends.clear();
recvs.clear();
for (size_t i = 0; i < N; ++i) {
sends.push_back(world.isend(0, i, out));
recvs.push_back(world.irecv(0, i, in[i]));
}
boost::mpi::wait_all(sends.begin(), sends.end());
boost::mpi::wait_all(recvs.begin(), recvs.end());
std::cout << "Multiple transfers with same tags\n";
sends.clear();
recvs.clear();
for (size_t i = 0; i < N; ++i) {
sends.push_back(world.isend(0, 0, out));
recvs.push_back(world.irecv(0, 0, in[i]));
}
boost::mpi::wait_all(sends.begin(), sends.end());
boost::mpi::wait_all(recvs.begin(), recvs.end());
return 0;
}
在這個程序中,我首先在不同的標籤上進行2次傳輸,這可以正常工作。然後,我試圖在相同的標籤2傳輸,該傳輸失敗:
的libC++ abi.dylib:與類型升壓的未捕獲的異常終止:: exception_detail :: clone_impl>:MPI_Unpack:MPI_ERR_TRUNCATE:消息截斷
如果我使用本地MPI數據類型,以便序列化不被調用,事情似乎工作。 MacPorts boost 1.55與OpenMPI 1.7.3同樣出現錯誤,Debian使用OpenMPI 1.4.5提升1.49。我直接用API C接口嘗試了多個帶有相同標籤的傳輸並且似乎可行,但我當然只能傳輸本地MPI數據類型。
我的問題是,在同一個標記上是否有多個未完成的傳輸是boost::mpi
的有效操作,如果是的話,我的程序中是否存在錯誤或者是否存在boost::mpi
?
感謝您的回覆,但事實並非如此。發送和恢復的發佈順序不會改變測試的行爲。而且,如果我只是在等待的時候而不是在發送上,行爲也是一樣的。至於緩衝,請注意我調用了不使用MPI緩衝的'isend()'和'irecv()'(任何緩衝都在'boost :: mpi'中完成)。 – rhashimoto
它不明確使用緩衝,但MPI的實現確實使用緩衝。你有沒有嘗試把發送和接收都放在同一個矢量中? –
單個發送和接收即將開始工作。我的目的不是爲了避免測試程序中的錯誤;它是確定行爲是否正確。還要注意,當直接調用MPI C API時,多個'isend/irecv'傳輸工作,即繞過'boost :: mpi'。 – rhashimoto