• MPI编程的常用接口速查


    获取当前时间

    在插入MPI提供的头文件后,可以获得获取时间的函数。

    double MPI_Wtime(void) 取得当前时间, 计时的精度由 double MPI_Wtick(void) 取得
    作为对比,一般在C/C++中, 插入time.h,通过 clock_t clock(void) 取得当前时间, 计时的精度由常数 CLOCKS_PER_SEC 定义。

     点到点通信函数

    进程间的通信需要通过一个通信器来完成。MPI 环境在初始化时会自动创建两个通信器,一个称为 MPI_COMM_WORLD,它包含程序中的所有进程,另一个称为 MPI_COMM_SELF,它是每个进程独自构成的、仅包含自己的通信器。MPI 系统提供了一个特殊进程号 MPI_PROC_NULL,它代表空进程 (不存在的进程),与 MPI_PROC_NULL 进行通信相当于一个空操 作,对程序的运行没有任何影响。

    使用MPI_Barrier(communicator)来完成同步

    使用MPI_Send(message, size, data_type, dest_id, tag, communicator) 来把数据message封装起来成为真正的消息结构,向进程号为dest_id的进程发送数据,是否要先把消息存入缓冲区根据默认缓冲区的大小确定。

    使用MPI_Bsend(message_data, size, data_type, dest_id, tag, communicator) 来发送数据,需要预先注册一个缓冲区,并调用MPI_Buffer_attach(buffer, buf_size)来供MPI环境使用

    使用MPI_Buffer_attach(buffer, size)来把缓冲区buffer提交给MPI环境,其中buffer是通过malloc分配的内存块。

    使用MPI_Buffer_detach(&buffer,&size)来确保传输的完成,尽量把detach和attach函数配对使用,正如尽可能同时使用malloc和free,同时使用Init和Finalize,防止遗漏!

    使用MPI_Pack_size(size, data_type, communicator, &pack_size)来获取包装特定类型的数据所需要的缓冲区大小(还没有计入头部,所以真正缓冲区大小 buf_size = MPI_BSEND_OVERHEAD + pack_size,如果有多份数据发送,则buf_size还要叠加)。

    使用MPI_Recv(message, size, data_type, src_id, tag, communicator, status)来接收数据,把已经到达接收缓冲区的数据解析到message数组中,只有全部数据都解析出来时,函数才返回。

    tips:除了上述两种发送模式外,还有就绪通信MPI_Rsend()和同步通信MPI_Ssend(),参数都是一致的,函数的区别在于,如果已经保证接收动作在发送动作之前启动了(可以利用MPI_Barrier函数做到这一点),那么就可以使用MPI_Rsend()提高效率;如果需要保证接收动作发生后,发送动作才能返回,那么就使用MPI_Ssend()

    tips:上面都是阻塞通信的方式,也就是调用这些函数的时候进程可能会阻塞。可以使用别的通信模式,或者使用多线程来改变这一点。

    集合通信

    MPI_Bcast广播,使得数据有p份拷贝

    MPI_Scatter散发,每份数据只拷贝一次

    MPI_Gather收集,每份数据只拷贝一次

    MPI_Reduce归约

    以后如果需要用到再写吧。

    数据类型和预定义的量

    用于作为参数的数据类型 MPI_INT, MPI_DOUBLE, MPI_CHAR, MPI_Status 

    预定义的量 MPI_STATURS_IGNORE, MPI_ANY_SOURCE, MPI_ANY_TAG

    初始化与结束

    使用MPI_Init(&argc, &argv)来初始化MPI环境,可能是一些全局变量的初始化。

    使用MPI_Comm_rank(communicator, &myid)来获取当前进程在通信器中具有的进程号。

    使用MPI_Comm_size(communicator, &numprocs)来获取通信器中包含的进程数目。

    使用MPI_Finalize()来结束并行编程环境。之后我们就可以创建新的MPI编程环境了。

  • 相关阅读:
    创建数据库命令(含自增id 创建时间 更新时间)
    jvm内存查看操作笔记
    dockerfile学习
    java 泛型
    IDE 改jvm内存大小 打印gc处理日志 jprofile内存分析工具使用和分析
    jvm内存(堆内存)了解
    vue 实现xmind 有空弄一下
    nmap接口扫描工具 有空了解下
    python 操作 redis
    Security 登录实现 这个博主的可以 亲测
  • 原文地址:https://www.cnblogs.com/xinchrome/p/4859119.html
Copyright © 2020-2023  润新知