我有关于在我们大学中使用高性能集群和带有 FORTRAN 的 MPI 的非常基本的问题。我已将我的 FORTRAN 代码复制到集群以包含 MPI,因为我无法在集群外编译我的 MPI Fortran 代码;在集群上我使用 emacs 作为编辑器。
由于emacs,这种编辑非常慢,尤其是从头开始写一些东西。有没有办法在集群外编辑、编译、链接和执行 Fortran 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代码吗?
我对以下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的教程进行操作
我想用LSF提交一份工作:
在没有LSF的情况下,我只需在4个节点上启动mpi,例如:
mpirun -hosts host1,host2,host3,host4 -np 4 ./myprocess --numthreads = 12
但是,在LSF存在的情况下,我看不出怎么做?我确信这可能是一种非常标准的方法,但我对LSF来说还是个新手.我用Google搜索,但答案对我来说并不是很明显.我在LSF中发现了混合MPI/OpenMP,但它似乎并不完全相同,似乎一次只需要一台主机.
我正在处理可多次调用子例程(依次执行迭代)的代码。我希望并行化子例程中的迭代。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在每次迭代之后等待,直到另一个进程完成其迭代呢?
我有一个关于MPI的基本问题,为了更好地理解它(我是MPI和多个过程的新手,所以请在这个上承担我的责任).我正在使用C++(RepastHPC)中的模拟环境,它广泛使用MPI(使用Boost库)来允许并行操作.特别是,模拟由各个类(即代理)的多个实例组成,它们应该相互交互,交换信息等.现在假设这发生在多个进程上(并且给出了我对MPI的基本理解)我所拥有的自然问题或恐惧是,不同进程的代理不再相互影响,因为它们无法连接(我知道,这与MPI的整个概念相矛盾).
阅读本手册后,我的理解是这样的:Boost.MPI的可用库(以及上面提到的包的库)负责处理所有通信并在进程之间来回发送包,即每个进程都有来自其他进程的实例(我猜这是某种形式的值调用,b/c原始实例不能从只有副本的进程中更改),然后进行更新,以确保实例的副本具有与原件相同的信息等.
这是否意味着,就模拟运行的最终结果而言,我会像在一个进程中完成整个事情一样?换句话说,多个过程只是为了加快速度而不是改变模拟的设计(因此我不必担心它)?
这个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) 我正在尝试分析MPI/OpenACC Fortran代码.我找到了一个网站,详细说明如何在这里使用MPI运行nvprof .给出的示例适用于OpenMPI.但是,我仅限于MPICH,我无法弄清楚它的等价物.谁知道它会是什么?
我有一个3D笛卡尔拓扑的nx通过ny由nz过程.有数学计算只涉及处理器的"铅笔".在的情况下,3通过3由3过程矩阵,从排0到26,过程4涉及三个操作:
13和22第一个方向1和7第二个方向3和5第三方向该数学运算需要属于同一铅笔的过程之间的点对点和集体通信.
对于点对点通信的问题,我曾经MPI_CART_SHIFT让每个进程知道相邻进程的排名.(然后我要用MPI_SENDRECV.)
关于集体通信的问题,如何进行此类通信?我认为一个解决方案可能是定义"铅笔"传播者,这个传播者的数量是多少nx*ny + nx*nz + ny*nz(所需的传播者数量相对于进程数量渐近地小,因为每个方向的进程数量增加).
这是唯一的方法吗?是否没有依靠笛卡尔传播者进行这种集体交流的标准子程序?
我是 C++ 的新手,并试图通过 MPI 发送 bool 数据类型,但 C++ 不支持这种数据类型。
我试图制作它MPI_BYTE,MPI_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)
没有错误消息。