MPI 中套接字编程的 select() 等效于什么?
What is equivalent of socket programming's select() in MPI?
在套接字编程中,我们有select()函数,它允许我们同时检查多个套接字。我想知道 MPI 库中是否也有这样的功能?
在以下代码的第一个 for 循环中,我从一个节点向每个其他节点发送多个非阻塞发送和接收请求。在第二个 for 循环中,我想开始处理首先发送其数据的节点的数据,而不是按顺序等待每个节点。 我想知道有什么办法可以做到这一点吗?
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
}
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(recvCount[id] != 0){
MPI_Wait(&reqs[id], &status);
for(i=0; i<recvCount[id]; i++)
splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]);
}
}
根据给定的答案,我尝试修改我的代码,但在运行时仍然出现分段错误错误。请帮助我找出错误。
for(id=0; id<numtasks; id++){
if(id == taskid) continue;
if(sendCount[id] != 0) MPI_Isend(sendBuffer[id], N*sendCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
if(recvCount[id] != 0) MPI_Irecv(recvBuffer[id], N*recvCount[id], MPI_DOUBLE, id, tag, MPI_COMM_WORLD, &reqs[id]);
}
reqs[taskid] = reqs[numtasks-1];
for(i=0; i<numtasks-1; i++){
MPI_Waitany(numtasks-1, reqs, &id, &status);
if(id == taskid) id = numtasks-1;
for(i=0; i<recvCount[id]; i++)
splitData(N, recvBuffer[id] + N*i, U[toRecv[id][i]]);
}
最接近的等价物是 MPI_Waitsome
,您提供请求列表,并在至少一个请求完成后立即返回。但是,没有像 select
中那样的超时。还有MPI_Waitany
、MPI_Waitall
以及MPI_Testany
、MPI_Testall
、MPI_Testsome
。
any
和 some
变体的主要区别在于界面通知您一个或多个已完成请求的方式。
编辑:您需要为每个操作使用单独的请求,特别是发送和接收操作。
相关文章:
- C++/autoconf 等效于文档库要求.txt的要求是什么?
- 什么相当于 Kotlin 上的C++指针?
- 霓虹灯中的_mm_hadd_ps相当于什么?
- 对于 poco 库来说,Boost_USE_STATIC_LIBS相当于什么?
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- C++ C 的双指针相当于什么?
- O(NlogN)算法运行速度快于O(n)..等等,什么
- Visual Studio 编译器的 record-gcc-switch 相当于什么?
- Visual Studio 中从 .Net 到 UWP C++的 SerialPort 类等效于什么?
- 十进制到二进制的实现不能完全适用于我大学的检查器。问题或提示可能是什么
- Linux和macOS中的WinAPI等效于什么?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- C++中的 java "package private"等效于什么?
- 什么相当于英特尔实感 3D 摄像头 (SR300) 的 pmdGet3DCoordinates?
- 在 C++ 中,映射相对于堆的优势是什么?
- "std::swap"应用于这些对象时会做什么?
- 在 c++ 中,跨向量的函子映射等效于什么
- 什么是提升等价于标准::可选空选项
- 将函子应用于设备数组的子集的最有效方法是什么
- std::array和std::vector的区别是什么?什么时候你用一个而不是另一个