3

我有一个 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 实现

4

0 回答 0