我有一个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
并不总是关注要接收的数据?运行mpiexec -n 12
会在每5次运行中打印“有人告诉我们”一次或两次。
我的问题是:当一个数据计算出来时,发送其他进程的方法是什么(接收不应该阻塞,发送可能阻塞)?
我在ubuntu 13.04上使用openmpi-1.6实现