标签: mpi

编辑和编译 MPI FORTRAN 代码

我有关于在我们大学中使用高性能集群和带有 FORTRAN 的 MPI 的非常基本的问题。我已将我的 FORTRAN 代码复制到集群以包含 MPI,因为我无法在集群外编译我的 MPI Fortran 代码;在集群上我使用 emacs 作为编辑器。

由于emacs,这种编辑非常慢,尤其是从头开始写一些东西。有没有办法在集群外编辑、编译、链接和执行 Fortran MPI 代码?如果一切都开始正常工作,那么最后我可以将代码复制到集群以并行运行。这将使我的生活变得非常轻松。非常感谢您提前。

扎胡尔·乌拉

linux parallel-processing fortran mpi

0
推荐指数
1
解决办法
278
查看次数

更新:我应该将MPI放在模块或模块的子程序中吗?

更新:我有问题,我不知道它是什么.我有一个MPI_INIT和MPI_FINALIZE测试程序.我有一个包含5个子程序的模块:3个子程序是相关的,独立于2个其他子程序.我想将测试程序中的MPI代码放入此模块中.我将MPI_INIT放在声明变量的模块中以及子例程之前.我使用相同的错误消息获取了一系列错误:

This statement must not appear in the specification part of a module
Run Code Online (Sandbox Code Playgroud)

"MPI_INIT和MPI_FINALIZE应该只调用一次"如何影响Fortran程序,模块和子程序?如果有多个独立的程序,每个调用该模块的子程序多次,我应该把MPI函数和变量放在哪里?

~~~~~~~~~我有一个包含一系列子程序的模块,其中包含我希望并行化的do循环.子例程是公共的,其他程序使用.我应该在子程序之外定义MPI:

module ...
call MPI_INIT
subroutine 1
... (MPI code)
subroutine 2
subroutine 3
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

或者在每个子程序里面?

module ...
subroutine 1
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 2
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 3
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
module
Run Code Online (Sandbox Code Playgroud)

我认为遵循粗粒原理的优点是解决方案1.如果一个程序调用子程序1,它还会在子程序之外执行MPI代码吗?

fortran mpi modulo subroutine

0
推荐指数
1
解决办法
1762
查看次数

mpiexec无法启动指定的应用程序(Raspberry pi)

我对以下3个命令中的每一个都得到了相同的错误.是来自ifconfig的我的ip地址.什么是错误的任何想法?昨晚工作得很好.

mpiexec -f machinefile -n <number> hostname
mpiexec -f machinefile –n 1 hostname
mpiexec -f machinefile -n 2 ~/mpich_build/examples/cpi
--------------------------------------------------------------------------
mpiexec was unable to launch the specified application as it could not find an executable:

Executable: -f
Node: raspberrypi

while attempting to start process rank 0.
--------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我正在按照http://www.southampton.ac.uk/~sjc/raspberrypi/pi_supercomputer_southampton.htm的教程进行操作

mpi mpiexec raspberry-pi

0
推荐指数
1
解决办法
9451
查看次数

如何在lsf中启动多线程mpi进程?

我想用LSF提交一份工作:

  • 并行运行在4个节点上
  • 每个节点都有一个mpi进程
  • 每个进程有12个线程

在没有LSF的情况下,我只需在4个节点上启动mpi,例如:

mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads = 12

但是,在LSF存在的情况下,我看不出怎么做?我确信这可能是一种非常标准的方法,但我对LSF来说还是个新手.我用Google搜索,但答案对我来说并不是很明显.我在LSF中发现了混合MPI/OpenMP,但它似乎并不完全相同,似乎一次只需要一台主机.

multithreading distributed-computing mpi openmp lsf

0
推荐指数
1
解决办法
4086
查看次数

在子例程中使用MPI

我正在处理可多次调用子例程(依次执行迭代)的代码。我希望并行化子例程中的迭代。mpi的问题是只允许我初始化一次。因此,我无法在子例程中对其进行初始化,该子例程被多次调用。有人可以提出解决方案吗?

我的问题大致如下:

program p

...

do i=1,10000
    call subroutine s(i)
end do

end program p

subroutine s(j)  

...

do i=1,10000
    ...
end do

end subroutine s
Run Code Online (Sandbox Code Playgroud)

我希望将这一过程并行化。

非常感谢。有帮助!但是,让我重新思考一下问题:在主程序的迭代中,连同子例程s,我必须调用另一个子例程s2(不需要并行化)。我以为可以这样做:

  !initialize mpi

  do i=1:1000

  if rank!=0

  call s

  else call s2

  end if

  end do

  !finalize mpi
Run Code Online (Sandbox Code Playgroud)

但是这里的主要问题是,尽管其余进程缓慢进行,但进程0将快速进行。因此,是否有可能让进程0在每次迭代之后等待,直到另一个进程完成其迭代呢?

fortran mpi subroutine

0
推荐指数
1
解决办法
2485
查看次数

MPI基础知识

我有一个关于MPI的基本问题,为了更好地理解它(我是MPI和多个过程的新手,所以请在这个上承担我的责任).我正在使用C++(RepastHPC)中的模拟环境,它广泛使用MPI(使用Boost库)来允许并行操作.特别是,模拟由各个类(即代理)的多个实例组成,它们应该相互交互,交换信息等.现在假设这发生在多个进程上(并且给出了我对MPI的基本理解)我所拥有的自然问题或恐惧是,不同进程的代理不再相互影响,因为它们无法连接(我知道,这与MPI的整个概念相矛盾).

阅读本手册后,我的理解是这样的:Boost.MPI的可用库(以及上面提到的包的库)负责处理所有通信并在进程之间来回发送包,即每个进程都有来自其他进程的实例(我猜这是某种形式的值调用,b/c原始实例不能从只有副本的进程中更改),然后进行更新,以确保实例的副本具有与原件相同的信息等.

这是否意味着,就模拟运行的最终结果而言,我会像在一个进程中完成整个事情一样?换句话说,多个过程只是为了加快速度而不是改变模拟的设计(因此我不必担心它)?

c++ boost mpi

0
推荐指数
1
解决办法
288
查看次数

为什么这个MPI程序不能输出超过2个处理器的更多信息?

这个MPI程序用C语言编写.当我输入2作为处理器数时,输出如下:

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 
Run Code Online (Sandbox Code Playgroud)

但是当我输入3个或更多处理器时,程序输出

P:0 Got data from processor 1 
P:0 Got 100 elements 
P:0 value[5]=5.000000 
Run Code Online (Sandbox Code Playgroud)

然后它停滞不前,没有别的东西被打印出来.我必须用[ctrl] + [c]退出程序.我不知道为什么节目会停滞不前.我很欣赏一些暗示或良好的方向.

这是代码:

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

/* Run with two processes */
int main(int argc, char *argv[]) {

        int rank, i, count;
        float data[100],value[200];

        MPI_Status status;
        MPI_Init(&argc,&argv);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);

        if(rank==1) {

                for(i=0;i<100;++i) data[i]=i;
                MPI_Send(data,100,MPI_FLOAT,0,55,MPI_COMM_WORLD);

        } else {

                MPI_Recv(value,200,MPI_FLOAT,MPI_ANY_SOURCE,55,MPI_COMM_WORLD,&status);
                printf("P:%d Got data from processor %d \n",rank, status.MPI_SOURCE);
                MPI_Get_count(&status,MPI_FLOAT,&count);
                printf("P:%d Got %d elements …
Run Code Online (Sandbox Code Playgroud)

c mpi

0
推荐指数
1
解决办法
100
查看次数

与MPICH的nvprof

我正在尝试分析MPI/OpenACC Fortran代码.我找到了一个网站,详细说明如何在这里使用MPI运行nvprof .给出的示例适用于OpenMPI.但是,我仅限于MPICH,我无法弄清楚它的等价物.谁知道它会是什么?

fortran mpi openacc nvprof

0
推荐指数
1
解决办法
191
查看次数

MPI笛卡尔拓扑中沿着方向的集体通信

我有一个3D笛卡尔拓扑nx通过nynz过程.有数学计算只涉及处理器的"铅笔".在的情况下,3通过33过程矩阵,从排026,过程4涉及三个操作:

  1. 与流程1322第一个方向
  2. 与过程17第二个方向
  3. 与流程35第三方向

该数学运算需要属于同一铅笔的过程之间的点对点和集体通信.

对于点对点通信的问题,我曾经MPI_CART_SHIFT让每个进程知道相邻进程的排名.(然后我要用MPI_SENDRECV.)

关于集体通信的问题,如何进行此类通信?我认为一个解决方案可能是定义"铅笔"传播者,这个传播者的数量是多少nx*ny + nx*nz + ny*nz(所需的传播者数量相对于进程数量渐近地小,因为每个方向的进程数量增加).

这是唯一的方法吗?是否没有依靠笛卡尔传播者进行这种集体交流的标准子程序?

hpc communication mpi

0
推荐指数
1
解决办法
85
查看次数

如何通过mpi C++发送布尔数据类型?

我是 C++ 的新手,并试图通过 MPI 发送 bool 数据类型,但 C++ 不支持这种数据类型。

我试图制作它MPI_BYTEMPI_INT但它什么也没打印。

#include <iostream>
#include "mpi.h"

using namespace std;

int main(int argc, char **argv)
{ 
    int R,P;
    MPI_Status status; 
    bool check = false;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &P);
    MPI_Comm_rank(MPI_COMM_WORLD, &R);
    if (R == 0)
    {
       check = true;
       MPI_Send(&check,1,MPI_BYTE,1,1,MPI_COMM_WORLD);
    }
    else if (R == 1)
    {  
       MPI_Recv(&check,1,MPI_BYTE,0,1,MPI_COMM_WORLD,&status);
       cout << R <<"\t check is \t"<< check << endl;
    }

    MPI_Finalize();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有错误消息。

c++ mpi

0
推荐指数
1
解决办法
1331
查看次数