我正在尝试这些逻辑代码,我不知道它们之间有什么不同。我想在我的程序中使用 <!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);
}
mpirun -np 100 ./test <arguments>
我认为两个逻辑都会得到进程的等级,并将其解析为MPI_Send上的参数。有什么不同???
我正在使用OpenMPI 1.8开发Debian Kali Linux。 我是MPI的新手。谢谢你的帮助。
答案 0 :(得分:1)
这是完全不同的。
一方面,在逻辑1中,单个消息从进程0发送到进程1.另一方面,在逻辑2中,world_size-1
消息由进程0发送,每个剩余进程接收一个消息来自0的消息。第二种情况可以通过调用MPI_Bcast()
替换。
如果你试过mpirun -np 2 ./test <arguments>
这些代码会做同样的事情......但这是唯一的情况!
代码摘要似乎都是正确的。第一种情况下的失败可能是由于整数number
未在进程2到world_size
上初始化的事实。例如,如果number
是数组的长度,则可以触发分段错误。如果number
是for
循环中停止条件的一部分,它可以触发一个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的进程到达。