我正在开始使用MPI进行一些模拟,并希望在Python/scipy中进行编程.scipy 网站列出了许多mpi库,但我希望从使用过它的人那里获得有关质量,易用性等方面的反馈.
在MPI中,我正在对值进行reduce操作(最小值).这样可以正常工作,但是如何获取最小值的处理器编号并请求该处理器获取更多信息(或使用reduce操作发送附加数据)?
很明显,它的论点是:
int MPI_Type_create_subarray(
int ndims,
int array_of_sizes[],
int array_of_subsizes[],
int array_of_starts[],
int order,
MPI_Datatype oldtype,
MPI_Datatype *newtype
);
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解这个方法如何接收我们想要分割的原始数组以及它返回新子数组的位置(因为此方法应该返回一个整数).换句话说,我只是想在C++中看到这个方法的简单实现,我无法在Internet上找到它.
我正试图在debian 7上使用openmpi和mpirun运行这个示例hello world程序.
#include <stdio.h>
#include <mpi/mpi.h>
int main (int argc, char **argv) {
int nProcId, nProcNo;
int nNameLen;
char szMachineName[MPI_MAX_PROCESSOR_NAME];
MPI_Init (&argc, &argv); // Start up MPI
MPI_Comm_size (MPI_COMM_WORLD,&nProcNo); // Find out number of processes
MPI_Comm_rank (MPI_COMM_WORLD, &nProcId); // Find out process rank
MPI_Get_processor_name (szMachineName, &nNameLen); // Get machine name
printf ("Hello World from process %d on %s\r\n", nProcId, szMachineName);
if (nProcId == 0)
printf ("Number of Processes: %d\r\n", nProcNo);
MPI_Finalize (); // Shut down MPI
return 0;
} …Run Code Online (Sandbox Code Playgroud) 需要澄清我对发送类型中给出的isend和issend的理解
我的理解是,一旦发送缓冲区空闲,即所有数据都被释放后,isend将返回.另一方面,Issend仅在收到获取/未获取整个数据的确认时才返回.这就是全部吗?
我对三件事感到困惑:mpirun,mpiexec和mpiexec.hydra
在我的集群上,所有这些都存在,并且所有这些都属于英特尔.
他们之间有什么区别和关系?特别是,什么是mpiexec.hydra?为什么mpiexec和hydra之间有一个点,这是什么意思?
从这里:文件是否在UNIX中附加原子
考虑多个进程打开同一文件并附加到其中的情况.O_APPEND保证寻找到文件的末尾然后开始写操作是原子的.因此,只要每个写入大小<= PIPE_BUF,多个进程就可以附加到同一个文件中,并且任何进程都不会覆盖任何其他进程的写入.
我编写了一个测试程序,其中多个进程打开并写入同一个文件(write(2)).我确保每个写入大小> PIPE_BUF(4k).我期待看到进程覆盖其他人数据的实例.但那并没有发生.我测试了不同的写入大小.那只是运气还是有理由不这样做?我的最终目标是了解附加到同一文件的多个进程是否需要协调其写入.
这是完整的计划.每个进程都创建一个int缓冲区,用它填充所有值rank,打开一个文件并写入它.
规格:Opensuse 11.3 64位的OpenMPI 1.4.3
编译为:mpicc -O3 test.c,运行方式:mpirun -np 8 ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int
main(int argc, char** argv) {
int rank, size, i, bufsize = 134217728, fd, status = 0, bytes_written, tmp_bytes_written;
int* buf;
char* filename = "/tmp/testfile.out";
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
buf = (int*) malloc (bufsize * sizeof(int));
if(buf == NULL) {
status = -1; …Run Code Online (Sandbox Code Playgroud) 我有一个Fortran程序,我指定kind数字数据类型,试图保持最低精度,无论使用什么编译器来构建程序.例如:
integer, parameter :: rsp = selected_real_kind(4)
...
real(kind=rsp) :: real_var
Run Code Online (Sandbox Code Playgroud)
问题是我使用MPI来并行化代码,我需要确保MPI通信指定具有相同精度的相同类型.我使用以下方法与我的程序中的方法保持一致:
call MPI_Type_create_f90_real(4,MPI_UNDEFINED,rsp_mpi,mpi_err)
...
call MPI_Send(real_var,1,rsp_mpi,dest,tag,MPI_COMM_WORLD,err)
Run Code Online (Sandbox Code Playgroud)
但是,我发现这个MPI例程对于不同的MPI实现并没有特别好的支持,所以它实际上使我的程序不可移植.如果我省略了MPI_Type_create例程,那么我将依赖于标准MPI_REAL和MPI_DOUBLE_PRECISION数据类型,但如果该类型与selected_real_kind最终将由MPI传递的真实类型的选择不一致,该怎么办?我是不是只使用标准real声明的数据类型,没有kind属性,如果我这样做,我保证,MPI_REAL并且real总是会有相同的精度,无论编译器和机器?
更新:
我创建了一个简单的程序,演示了当我的内部实数比MPI_DOUBLE_PRECISION类型提供的精度更高时我看到的问题:
program main
use mpi
implicit none
integer, parameter :: rsp = selected_real_kind(16)
integer :: err
integer :: rank
real(rsp) :: real_var
call MPI_Init(err)
call MPI_Comm_rank(MPI_COMM_WORLD,rank,err)
if (rank.eq.0) then
real_var = 1.123456789012345
call MPI_Send(real_var,1,MPI_DOUBLE_PRECISION,1,5,MPI_COMM_WORLD,err)
else
call MPI_Recv(real_var,1,MPI_DOUBLE_PRECISION,0,5,MPI_COMM_WORLD,&
MPI_STATUS_IGNORE,err)
end if
print …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Windows 8安装MPI,所以当我搜索网络时,我得到了在XP/7上安装它的步骤,但不适用于Windows 8.链接是:http://swash.sourceforge.net/online_doc/swashimp/node9 html的
但首先,当我必须允许mpi.exe和smpd.exe通过防火墙进行通信时,这些exe文件未列出.其次,当我运行cmd(以管理员身份)并键入:"smpd -install"时,它会显示:"未知选项:-install".我猜Windows 8的命令是别的.如果有人帮助我,我将非常感激,因为我无法继续前进.