您的位置:

全能工程师必备技能——mpirun-np

一、什么是mpirun-np

mpirun-np是一种用于并行计算的命令行工具,其作用是启动并运行一个并行计算程序。它是OpenMPI软件包的一部分,可以用于分布式计算环境中的任务分配。

mpirun-np命令的-np参数指定使用的进程数,也就是启动的并行运算的进程数。如果-np参数为1,那么mpirun-np就会在本地启动一个单进程的应用程序。

$mpirun-np 4 ./myprogram

二、mpirun-np的使用方式

mpirun-np的使用方式非常灵活,可以启动任意类型的程序。下面介绍几种常见的使用方式。

1. 启动MPI程序

如果要启动MPI程序,可以使用mpirun-np命令并指定启动的进程数和要执行的程序名。

$mpirun-np 4 ./my_mpi_program

上面的命令将启动一个4个进程的MPI程序。

2. 启动OpenMP程序

如果要启动OpenMP程序,可以使用mpirun-np命令并指定启动的进程数和要执行的程序名。

$mpirun-np 1 ./my_openmp_program

上面的命令将启动一个单进程的OpenMP程序。

3. 启动Hybrid程序

Hybrid程序是MPI和OpenMP混合并行编程的程序。如果要启动Hybrid程序,需要在mpirun-np命令中指定MPI的进程数和OpenMP的线程数。

$mpirun-np 4 -x OMP_NUM_THREADS=2 ./my_hybrid_program

上面的命令将启动一个4个进程,每个进程使用2个线程的Hybrid程序。

三、mpirun-np的实例演示

1. MPI实例演示

下面演示一个简单的MPI程序的运行。

程序代码:

#include 
#include 
   

int main(int argc, char** argv){
    //初始化MPI环境
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    //打印进程ID和进程总数
    printf("Hello world from rank %d of %d\n", rank, size);

    //终止MPI环境
    MPI_Finalize();
}

   
  

命令行输入:

$mpirun-np 4 ./mpi_hello_world

输出结果:

Hello world from rank 0 of 4
Hello world from rank 1 of 4
Hello world from rank 2 of 4
Hello world from rank 3 of 4

上面的命令将会启动4个进程的MPI程序,并输出每个进程的rank和进程总数。

2. OpenMP实例演示

下面演示一个简单的OpenMP程序的运行。

程序代码:

#include 
#include 
   

int main() {
    #pragma omp parallel
    {
        printf("Hello, World! (thread %d)\n", omp_get_thread_num());
    }
}

   
  

命令行输入:

$mpirun-np 1 ./openmp_hello_world

输出结果:

Hello, World! (thread 0)
Hello, World! (thread 1)
Hello, World! (thread 2)
Hello, World! (thread 3)

上面的命令将会启动单进程的OpenMP程序,并输出每个线程的编号。

3. Hybrid实例演示

下面演示一个简单的Hybrid程序的运行。

程序代码:

#include 
#include 
   
#include 
    

int main(int argc, char** argv){
    //初始化MPI环境
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    //设置并行线程数
    int thread_count = 2;
    //设置每个MPI进程的线程数
    omp_set_num_threads(thread_count);

    #pragma omp parallel
    {
        //打印进程ID、进程总数、线程ID和线程总数
        printf("Hello world from rank %d of %d (thread %d of %d)\n", rank, size, omp_get_thread_num(), thread_count);
    }

    //终止MPI环境
    MPI_Finalize();
}

    
   
  

命令行输入:

$mpirun-np 4 -x OMP_NUM_THREADS=2 ./hybrid_hello_world

输出结果:

Hello world from rank 0 of 4 (thread 0 of 2)
Hello world from rank 1 of 4 (thread 0 of 2)
Hello world from rank 2 of 4 (thread 0 of 2)
Hello world from rank 3 of 4 (thread 0 of 2)
Hello world from rank 0 of 4 (thread 1 of 2)
Hello world from rank 1 of 4 (thread 1 of 2)
Hello world from rank 2 of 4 (thread 1 of 2)
Hello world from rank 3 of 4 (thread 1 of 2)

上面的命令将会启动4个进程,每个进程使用2个线程的Hybrid程序,并输出每个进程和线程的编号。