我有一个 C 程序,它查看一个非常大的文件并搜索某个东西。它是这样工作的:
- 查找填充大小
fseek(file_descriptor, 0, SEEK_END)
- 按进程数划分
- 每个进程在其边界之间执行二进制搜索
现在我想做的是当一个进程找到正在搜索的内容时(基本上是ftell(file_descriptor)
将其发送到所有其他进程的偏移量。
我的方法是这样的:
MPI_Irecv(&buffer..., MPI_ANY_SOURCE,... &request);
while (condition) {
MPI_Test(&request, &test, &status);
if (test == 1) {
// break since data is in buffer ?
printf("someone told us");
break;
}
//code
if (condition_for_found) {
offset = ftell(file_descriptor);
for (i = 0; i < numprocs; ++i) {
MPI_Send(&offset, ...i, ...);
}
break; // (*)
}
}
我没有正确发布 C 语法代码,因为我认为这是一个方法问题。我认为我缺乏理解的是:
send
并且recv
必须匹配调用次数,但是 (*) break 语句会导致send
再调用一次recv
?MPI_Irecv
不总是注意接收数据?
Runningmpiexec -n 12
将在每 5 次运行中打印一次或两次“有人告诉我们”。
我的问题是:当计算数据时,向其他进程发送一些数据的方法是什么(接收不应该阻塞,发送可能会阻塞)?
我在 ubuntu 13.04 上使用 openmpi-1.6 实现