与MPI_SEND的不同之处在于,循环中的等级和MPI中的无循环发送

时间:2015-09-23 16:56:36

标签: mpi openmpi

我正在尝试这些逻辑代码,我不知道它们之间有什么不同。我想在我的程序中使用 <!DOCTYPE html> <?php header('Access-Control-Allow-Origin: *'); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8"> <title>Tableau API</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> </head> <script type='text/javascript'> $( document ).ready(function() { console.log( "ready!" ); $.support.cors = true; $.ajax( { url: 'http://172.18.74.145/api/2.0/auth/signin', type: 'POST', data: { content: '<tsRequest><credentials name="E747176a" password="Kaisersa2015" ><site contentUrl="" /></credentials></tsRequest>'}, success: function( response ) { console.log(response) } } ); }); </script> MPI_Send()。据我所知,在MPI中,进程通过每个处理器的行列和每个消息的标记进行通信。所以,如果我尝试

,会有什么不同

逻辑1:

MPI_Recv()

逻辑2:

int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);

int number;
if (world_rank == 0) {
    number = -1;
    MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
} else if (world_rank == 1) {
    MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
             MPI_STATUS_IGNORE);
    printf("Process 1 received number %d from process 0\n",
           number);
}

我尝试:int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); int world_size; MPI_Comm_size(MPI_COMM_WORLD, &world_size); int number; if (world_rank == 0) { number = -1; int i =0; for(i = 1 ; i< world_size;i++){ MPI_Send(&number, 1, MPI_INT, i, 0, MPI_COMM_WORLD); } }else{ MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); printf("Process 1 received number %d from process 0\n", number); }

  • 逻辑1:几分钟后,我的电脑就一直挂着。
  • 逻辑2:它有效,并打印100行:mpirun -np 100 ./test <arguments>

我认为两个逻辑都会得到进程的等级,并将其解析为MPI_Send上的参数。有什么不同???

我正在使用OpenMPI 1.8开发Debian Kali Linux。 我是MPI的新手。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

这是完全不同的。

一方面,在逻辑1中,单个消息从进程0发送到进程1.另一方面,在逻辑2中,world_size-1消息由进程0发送,每个剩余进程接收一个消息来自0的消息。第二种情况可以通过调用MPI_Bcast()替换。

如果你试过mpirun -np 2 ./test <arguments>这些代码会做同样的事情......但这是唯一的情况!

代码摘要似乎都是正确的。第一种情况下的失败可能是由于整数number未在进程2到world_size上初始化的事实。例如,如果number是数组的长度,则可以触发分段错误。如果numberfor循环中停止条件的一部分,它可以触发一个infine循环(或一个很长的循环)。

答案 1 :(得分:0)

被修改

由于我们缺少完整的源代码,因此无法确定初始化/终结函数是否已正确使用。

这里我们从初始答案中获得了相同的源代码+正确运行mpi应用程序所需的内容:

#include <stdio.h>
#include <mpi.h>

int
main (int argc, char *argv[])
{
    MPI_Init(&argc, &argv);

    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    int number;
    if (world_rank == 0) {
        number = -1;
        MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    } else if (world_rank == 1) {
        MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
                 MPI_STATUS_IGNORE);
        printf("Process 1 received number %d from process 0\n",
               number);
    }

    MPI_Finalize();
}

编译:

> mpicc -std=c99 -O2 -g -Wall -I. -o app app.c -lm

执行命令

> mpirun -n 10 app
Process 1 received number -1 from process 0
>

基本上一切都运行正常,所以我猜问题可能与初始化/终结有关。

初步回复

您的应用程序与逻辑1挂起,因为有99个进程正在等待消息,但主进程仅将消息发送到由等级1标识的进程。

当您使用阻止功能(即MPI_Send与MPI_Isend)时,有98个进程永远等待,直到消息从排名为0,tag = 0和通信器MPI_COMM_WORLD的进程到达。