zoukankan      html  css  js  c++  java
  • MPI学习一

    1.第一个MPI程序

     1 #include <mpi.h>
     2 #include <stdio.h>
     3 int main(int argc, char **argv)
     4 { 
     5     //your code here
     6     MPI_Init(&argc, &argv);
     7     
     8     printf("Hello World!
    ");
     9     
    10     MPI_Finalize();
    11     //end of your code 
    12     
    13     return 0;
    14 }

    2.获取进行数量

     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int numprocs;
     7     MPI_Init(&argc, &argv);
     8 
     9     //your code here
    10     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    11     //end of your code
    12 
    13     printf("Hello World! The number of processes is %d
    ",numprocs);
    14 
    15     MPI_Finalize();
    16     return 0;
    17 }

    3.获取进程ID

     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs;
     7     MPI_Init(&argc, &argv);
     8 
     9     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    10     
    11     //your code here
    12     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    13     //end of your code
    14 
    15     printf("Hello World!I'm rank %d of %d
    ", myid, numprocs);
    16 
    17     MPI_Finalize();
    18     return 0;
    19 }

    4.获取处理器名

     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int len;
     7     char name[MPI_MAX_PROCESSOR_NAME];
     8     MPI_Init(&argc, &argv);
     9 
    10     //your code here
    11     MPI_Get_processor_name (name, &len);
    12     //end of your code
    13 
    14     printf("Hello, world. I am %s.
    ", name);
    15 
    16     MPI_Finalize();
    17     return 0;
    18 }

    5.运行时间

     1 #include<stdio.h>
     2 #include<mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs;
     7     double start, finish;
     8     
     9     MPI_Init(&argc, &argv);
    10 
    11     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    12     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    13 
    14     //your code here
    15     start = MPI_Wtime();
    16     
    17     printf("The precision is: %f
    ", MPI_Wtick());
    18     
    19     finish = MPI_Wtime();
    20     //your code here
    21     
    22     printf("Hello World!I'm rank %d of %d, running %f seconds.
    ", myid, numprocs, finish-start);
    23 
    24     MPI_Finalize();
    25     return 0;
    26 }

    6.同步

    #include<stdio.h>
    #include<mpi.h>
    
    int main(int argc, char **argv)
    {
        int myid, numprocs;
        double start, finish;
        
        MPI_Init(&argc, &argv);
    
        MPI_Comm_rank(MPI_COMM_WORLD, &myid);
        MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    
        //your code here
        MPI_Barrier(MPI_COMM_WORLD);
        //end of your code
        
        start = MPI_Wtime();
        
        printf("The precision is: %f
    ", MPI_Wtick());
        
        finish = MPI_Wtime();
        
        printf("Hello World!I'm rank %d of %d, running %f seconds.
    ", myid, numprocs, finish-start);
    
        MPI_Finalize();
        return 0;
    }

    7.消息传递

    int MPI_Send(void* msg_buf_p, int msg_size, MPI_Datatype msg_type, int dest, int tag, MPI_Comm communicator)
    int MPI_Recv(void* msg_buf_p, int buf_size, MPI_Datatype msg_type, int source, int tag, MPI_Comm communicator, MPI_Status *status_p)
     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs, source;
     7     MPI_Status status;
     8     char message[100];
     9 
    10     MPI_Init(&argc, &argv);
    11     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    12     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    13     
    14     if(myid != 0) {
    15         strcpy(message, "hello world!");
    16         
    17         //your code here
    18         MPI_Send(message, strlen(message)+1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
    19         //end of your code
    20     }
    21     else { //myid == 0
    22         for(source=1; source<numprocs; source++) {
    23             //your code here
    24             MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status);
    25             //end of your code
    26             
    27             printf("%s
    ", message);
    28         }
    29     }
    30 
    31     MPI_Finalize();
    32     return 0;
    33 }

    8.地址偏移量

     1 #include<stdio.h>
     2 #include<mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs;
     7     MPI_Aint address1, address2, address3;
     8     int a, b, c, dist1, dist2;
     9     
    10     a = 1;
    11     b = 2;
    12     c = 3;
    13     
    14     MPI_Init(&argc, &argv);
    15     
    16     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    17     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    18     
    19     
    20     // your code here
    21     MPI_Address(&a, &address1);
    22     MPI_Address(&b, &address2);
    23     MPI_Address(&c, &address3);
    24     // end of your code
    25     
    26     dist1 = address2 - address1 ;
    27     dist2 = address3 - address1 ;
    28     
    29     if(myid == 0) {
    30         printf("The distance between a and b is %d
    ", dist1);
    31         printf("The distance between a and c is %d
    ", dist2);
    32     }
    33 
    34     MPI_Finalize();
    35     return 0;
    36 }

    9.数据的打包

    int MPI_Pack(void* inbuf, int incount, MPI_datatype datatype, void *outbuf, int outcount, int *position, MPI_Comm comm) 
    
    void* inbuf : 输入缓冲区地址;
    int incount :输入数据项数目;
    MPI_datatype datatype :数据项的类型;
    void *outbuf :输出缓冲区地址;
    int outcount :输出缓冲区大小;
    int *position :缓冲区当前位置;
    MPI_Comm comm :通信子;
     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs, source;
     7     MPI_Status status;
     8     int i, j, position;
     9     int k[2];
    10     int buf[1000];
    11 
    12     MPI_Init(&argc, &argv);
    13     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    14     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    15     
    16     i = 1;
    17     j = 2;
    18     
    19     if(myid == 0) {
    20         
    21         position = 0 ;
    22         
    23         // your code here
    24         MPI_Pack(&i, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD); 
    25         MPI_Pack(&j, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD); 
    26         // end of your code
    27         
    28         MPI_Send(buf, position, MPI_PACKED, 1, 99, MPI_COMM_WORLD); 
    29     }
    30     else if (myid == 1){ 
    31         MPI_Recv(k, 2, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
    32         
    33         position = 0 ;
    34         
    35         MPI_Unpack(k, 2, &position, &i, 1, MPI_INT, MPI_COMM_WORLD);
    36         MPI_Unpack(k, 2, &position, &j, 1, MPI_INT, MPI_COMM_WORLD);
    37         
    38         printf("The number is %d and %d", i, j);
    39     }
    40 
    41     MPI_Finalize();
    42     return 0;
    43 }

    10.数据的解包

    int MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm) 
    
    void* inbuf : 输入缓冲区地址;
    int insize :输入数据项数目;
    MPI_datatype datatype :数据项的类型;
    void *outbuf :输出缓冲区地址;
    int outcount :输出缓冲区大小;
    int *position :缓冲区当前位置;
    MPI_Comm comm :通信子;
     1 #include <stdio.h>
     2 #include <mpi.h>
     3 
     4 int main(int argc, char **argv)
     5 {
     6     int myid, numprocs, source;
     7     MPI_Status status;
     8     int i, j, position;
     9     int k[2];
    10     int buf[1000];
    11 
    12     MPI_Init(&argc, &argv);
    13     MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    14     MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    15     
    16     i = 1;
    17     j = 2;
    18     
    19     if(myid == 0) {
    20         
    21         position = 0 ;
    22         
    23         MPI_Pack(&i, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD); 
    24         MPI_Pack(&j, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD); 
    25         
    26         MPI_Send(buf, position, MPI_PACKED, 1, 99, MPI_COMM_WORLD); 
    27     }
    28     else if (myid == 1){ 
    29         MPI_Recv(k, 2, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
    30         
    31         position = 0 ;
    32         i = j = 0;
    33         
    34         // your code here
    35         MPI_Unpack(k, 2, &position, &i, 1, MPI_INT, MPI_COMM_WORLD);
    36         MPI_Unpack(k, 2, &position, &j, 1, MPI_INT, MPI_COMM_WORLD);
    37         // end of your code
    38         
    39         printf("The number is %d and %d", i, j);
    40     }
    41 
    42     MPI_Finalize();
    43     return 0;
    44 }

     来自:MPI编程实训学习(超算习堂)

  • 相关阅读:
    Git删除不存在对应远程分支的本地分支
    Git删除远程分支
    将博客搬至CSDN
    HttpStatus
    Mysql 日期
    jekyll开发静态网站
    修改maven默认的jdk版本
    使用@Value进行静态常量的值注入
    妙笔生花处,惊艳四座
    Integer 和 int 值比较
  • 原文地址:https://www.cnblogs.com/lin1216/p/12893088.html
Copyright © 2011-2022 走看看