当前的一些实现java
Open MPI Java Bindings 只能使用Open MPI 座位底层通讯库。数组
随着处理器核数的增长,须要混合并行计算。网络
Hybrid MPI 使用单线程MPI进程。多线程
在Hybrid MPI中,单节点的多核处理器经过共享堆内存进行通讯。所以须要安装一个自定义堆内存管理器,用来把共享堆内存的分配给MPI进程,这些进程能够相互访问其内存。架构
在Java领域提出MPJ Express。socket
利用池机制。性能
API的使用spa
在MPJ Express 高层,点对点通讯中:线程
举例:发送一个int型数组的10个元素设计
Java:
JDK1.4引入NIO,在NIO中,JVM操做一系列buffer类来对文件和socket进行读写。ByteBuffer类实现了一个字节数组,但存储在JVM堆内存外部(所谓的直接字节缓冲区)。
因此,当用户想传一个int型数组的10个元素时,可将其复制到一个ByteBuffer中,相似的,若是想传递一个派生数据类型,则能够把派生数据类型中的每一个基本数据类型打包,存到ByteBuffer中,这样软件的高层个底层就能够经过缓冲层提供的的功能对基本数据类型和高级数据类型进行通讯。对于专用网络,NIO能够直接读取直接字节缓冲区,这样能够消除使用JNI带来的额外复制。
缓冲策略利用池机制来下降通讯开销————减小通讯buffer的建立时间。
通讯层中是否有缓冲对Java消息库的性能影响极大
因为缺少统一标准,Java MPI库为了性能最优,其遵循的标准各不相同。由此提出:要解决标准统一的问题。
hybrid device 的设计
基于现有的device进行设计,这样能够选用任何一个网络device进行节点间通讯,同时有利于代码的服用,便于之后维护。
实现hybrid device时,首先遇到的问题:
MPJ Express 运行时系统负责启动计算节点上的进程。
bybdev的设计具备在使用运行时系统的单个计算节点上启动一个或多个网络device实例的灵活性
smpdev是一个多个通讯device,在那里,不一样的线程表明不一样的MPJ Express进程,每个线程有一个包含UUID的进程ID(PID)
smpdev的一个具备挑战性的需求是:smpdev依赖于xdev层中各线程中的共享变量,而用户程序中的变量禁止共享。
解决:smpdev和bybdev用过一种智能的类加载机制来知足这个要求。这个类加载机制是:MPJ Express软件的不一样包被分为2组,而后分别用不一样的的类加载器进行加载。
用户经过指定进程数和可用节点数来执行并行Java应用。基于此:
MPJ Express运行时动态地决定每一个节点中运行的线程数
hybdev建立一个链接网络中全部JVM的网络device实例
每一个节点建立一个smpdev实例
smpdev线程共享网络device,以便在网络中进行通讯
网络中的每一个节点用网络device的PID进行标识,这个PID座位网络ID
网络中的smpdev线程用他们的PID进行标识,这些PID也叫做线程ID
每一个节点仅使用一个网络device或固定数量的线程使得MPJ Express 可以利用更多的Java线程而不是进程,这样能够极大地减小device的初始化时间和网络资源开销。
到达的信息被放入队列,用户调用MPI.Recv()取出消息
smpdev和niodev实现了RecvQueue以用来保存当前用户发出的Recv()方法请求后尚未彻底接受的信息。
ArriveQueue用来保存已经彻底接受到的信息,但Recv()方法不是由用户发出的
网络device座位smpdev线程间的共享网络通道。
当同一节点中的2个线程想得到一条来自某个远程source的信息时,就会发生接受错误。任何线程都能获得被定向到对等县城的信息。
解决:在key中增长destination线程的UUID,这样,niodev就能区分destination线程。source和destination的UUID在信息的头部
MPJ Express 能够用MPI.ANY_SOURCE来检测通配符信息
在hybdev中,首先要解决用哪一个device来检索这样的信息
解决:在hybdev中启动一个新进程,该进程在smpdev队列和正在被使用的网络device中搜索通配符信息,找到后取出信息。
hybdev通讯device利用单个计算节点中的多线程,这些单个计算节点在节点间通讯时,共享单个网络通道,在以前的试验中发现,共享单个网络通道会在这个通道上发生拥塞(尤为是在多核节点中)。
解决:每一个节点引入多个网络通达————>每一个节点建立多个bybdev实例,每一个实例在单独的JVM中。这样,每一个节点有多个hybdev实例,每一个bybdev实例有本身的用于多节点通讯的网络通道。bybdev的实例数有每一个节点建立的的进程数决定,而进程是MPJ Express软件的可配参数。
对于点对点通讯,native device 使用叫做mpjbuf的MPJ Express中间缓冲层。
mpjbuf实现类 ————> NIO Buffer
使用NIO Buffer 时,应用数据以字节形式被复制到ByteBuffer中,而后送到mpjdev层 ,java NIO yong allocateDirect()方法吧ByteBuffer分配到JVM内存外面,这样native device就能直接获取ByteBuffer内存。native device获得地址后,把地址传给底层的本地MPI库。此处要注意,由于正在使用ByteBuffer进行数据通讯,MPI_BYTE数据类型被用做全部的点对点通讯。