Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPI在一个完成后向所有人发送数据_C_Mpi_Openmpi - Fatal编程技术网

C MPI在一个完成后向所有人发送数据

C MPI在一个完成后向所有人发送数据,c,mpi,openmpi,C,Mpi,Openmpi,我有一个C程序,它在一个很大的文件中查找某个东西。它是这样工作的: 查找填充大小fseek(文件描述符,0,查找结束) 按进程数划分 每个进程在其边界之间执行二进制搜索 现在我想做的是,当一个进程找到正在搜索的内容(基本上是偏移量ftell(文件描述符)时,将其发送到所有其他进程 我的方法是这样的: MPI_Irecv(&buffer..., MPI_ANY_SOURCE,... &request); while (condition) { MPI_Test(&

我有一个C程序,它在一个很大的文件中查找某个东西。它是这样工作的:

  • 查找填充大小
    fseek(文件描述符,0,查找结束)
  • 按进程数划分
  • 每个进程在其边界之间执行二进制搜索
现在我想做的是,当一个进程找到正在搜索的内容(基本上是偏移量
ftell(文件描述符)
时,将其发送到所有其他进程

我的方法是这样的:

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; // (*)
    }
}
MPI\u-Irecv(&buffer…、MPI\u-ANY\u-SOURCE…&request);
while(条件){
MPI_测试(请求、测试和状态);
如果(测试==1){
//因为数据在缓冲区中而中断?
printf(“有人告诉我们”);
打破
}
//代码
如果(找到的条件){
偏移量=ftell(文件描述符);
对于(i=0;i
我没有发布正确的C语法代码,因为我认为这是一个方法问题。 我认为我缺乏理解的是:

  • send
    recv
    的调用次数必须匹配,但是(*)break语句将导致
    send
    recv
    之后被再次调用
  • MPI\u Irecv
    不总是监视要接收的数据
运行
mpiexec-n 12
会在每5次运行中打印一两次“某人告诉我们的”

我的问题是:当一个进程计算了一些数据时,向其他进程发送数据的方法是什么(接收不应该是阻塞的,发送可能是阻塞的)


我在ubuntu 13.04上使用openmpi-1.6实现,这里的逻辑看起来不错。你的进程是否打破了while循环?我不会依赖printfstatements@kraffenetti我在写评论,但我想我明白了。正如我在帖子中所说的,只是有时候
printf(“有人告诉我们”)是执行的。我想问题在于,对于其余进程,
条件将它们从while中中断,因此它们不再测试
发送
。我会让它们等待一段时间,然后让您知道发生了什么。