一种面向众核处理器的并发通信方法、装置、设备和介质转让专利

申请号 : CN202310710637.9

文献号 : CN116455849B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 卢凯葛可适赖明澈徐金波马迪谢旻齐星云董勇张伟徐佳庆陆平静

申请人 : 中国人民解放军国防科技大学

摘要 :

本申请涉及一种面向众核处理器的并发通信方法、装置、设备和介质。所述方法包括:在发送和接收报文数据时,分别为虚拟端口在主存中设置报文发送缓冲区和报文接收缓冲区,并通过锁机制进行访问,并在网卡芯片设置缓冲区的计数器和读指针或写指针,由发送端或接收端软件和网卡硬件协同构成虚拟端口队列状态管理机制。本发明可以支持每个进程形成独占硬件的编程视图,允许多个进程在用户空间受保护地并发访问通信硬件资源,以确保并发通信时通信操作请求处理的原子性。此外,基于网卡硬件的软硬件协同虚拟端口队列状态管理机制,提高了内存中虚拟端口队列的利用效率与访问性能,提高了报文读写速度。

权利要求 :

1.一种面向众核处理器的并发通信方法,其特征在于,所述方法包括:

基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;

由发送端进程通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;

由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;

由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;

由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;

由所述接收端进程通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。

2.根据权利要求1所述的方法,其特征在于,所述第一虚拟端口对应的网卡芯片中还设置了所述报文发送缓冲区的信用值,在将要发送的数据封装为传输层报文写入所述报文发送缓冲区之前,还包括:通过检查所述报文发送缓冲区的信用值判断所述报文发送缓冲区中是否还有存储空间,若没有,则返回错误信息。

3.根据权利要求1所述的方法,其特征在于,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,包括:将要发送的数据切分成传输层报文中的数据载荷;所述数据载荷大小为112字节;

将所述数据载荷封装为传输层报文写入所述报文发送缓冲区;所述传输层报文为128字节,包括112字节的数据载荷、8字节报文头和8字节报文尾。

4.根据权利要求1所述的方法,其特征在于,所述将要发送的数据封装为传输层报文写入所述报文发送缓冲区,还包括:通过所述发送端进程访问所述报文发送缓冲区的写指针;所述报文发送缓冲区写指针指向所述报文发送缓冲区队列队首;

在所述报文发送缓冲区队列队首写入所述传输层报文。

5.根据权利要求1所述的方法,其特征在于,所述第一虚拟端口对应的网卡芯片中还设置了硬件动态共享缓冲区,由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程时,还包括:在多个发送端进程向各自虚拟端口的报文发送缓冲区中写入数据时,所述报文发送缓冲区中的数据将从主存写入所述硬件动态共享缓冲区中。

6.根据权利要求1所述的方法,其特征在于,从所述报文接收缓冲区中读取数据,包括:通过所述接收端进程通过所述报文接收缓冲区的读指针访问所述报文接收缓冲区队列队尾,读取所述报文接收缓冲区队尾的数据。

7.根据权利要求1至6任一项所述的方法,其特征在于,所述报文发送缓冲区的大小由分别配置的基地址和上界地址确定,大小可变,但最大不超过8M字节;所述报文发送缓冲区的所述基地址和所述上界地址存储在所述网卡芯片中;

所述报文接收缓冲区的大小由分别配置的基地址和上界地址确定,大小可变,但最大不超过8M字节;所述报文接收缓冲区的所述基地址和所述上界地址存储在所述网卡芯片中。

8.一种面向众核处理器的并发通信装置,其特征在于,所述装置包括:

第一虚拟端口确定模块,用于基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;

数据发送模块,用于由发送端进程通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;

网卡读取模块,用于由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;

第二虚拟端口确定模块,用于由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;

网卡写入模块,用于由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;

数据接收模块,用于由所述接收端进程通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。

9.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。

10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。

说明书 :

一种面向众核处理器的并发通信方法、装置、设备和介质

技术领域

[0001] 本申请涉及计算机系统结构领域,特别是涉及一种面向众核处理器的并发通信方法、装置、设备和介质。

背景技术

[0002] 近年来,高性能计算机(High Performance Computer,HPC)不仅在传统科学计算领域发挥着重要作用,而且为人工智能等技术的发展提供了算力基础。随着对HPC算力需求的不断提高,单个计算节点的计算能力也在不断提高。为解决单个节点计算能力提高带来的功耗、延迟、设计复杂度急剧上升的难题,越来越多的高性能计算平台采用了拥有几十甚至上百核心的众核处理器。例如,使用Intel Xeon Phi众核协处理器的超级计算机可以实现每秒千万亿次的浮点计算能力。
[0003] 众核处理器可以同时执行的进程数量与核数成正比。同时,对HPC系统中软件的运行分析表明,并行计算任务主要提交至少量节点,因此每个节点往往会同时启动数十乃至上百进程。这些进程一般通过消息传递接口(Message Passing Interface,MPI)进行。MPI是一种流行的并行编程模型,用于开发并行计算应用,例如科学计算和大规模人工智能模型训练。MPI应用程序通常需要执行大量的通信操作,包括点对点通信和聚合通信。因此,通信操作的时间开销与并行程序的执行时间密切相关,高性能的并行程序需要低延迟的进程间通信。
[0004] 然而,众核处理器同时启动的大量进程并发执行通信操作时,通信时延往往较高。这是因为当前互连网络接口芯片中通信硬件接口数量有限,因此能够同时支持的通信连接数往往有限。当大量进程同时需要通信数据时,需要首先获得互连网络接口芯片中寄存器等硬件资源的访问权限。因此不同的通信操作需要对通信硬件资源竞争以通信数据,当通信硬件资源较少时,无法支持超出通信硬件资源限制的进程进行通信。
[0005] 国际上主流的互连网络解决方案中,Infiniband通过QP来解决进程数量与通信接口数量不匹配的问题。进程通过分配QP来创建虚拟通信端口,通信发生在源节点的QP和目的节点的QP之间。多个进程并发通信时,发送和接收数据将被放入各自的QP当中,然后以轮询的方式发送、接收QP中的数据。日本富士公司推出的Tofu互连网络中也实现了类似的生产者‑消费者模式的队列。然而,现有网卡的并发通信方案中,有的硬件参与程度较低,通信延迟不理想;有的网卡过度依赖于处理器和网卡的高度集成,无法支持跨PCIE等总线的主机/网卡间的软硬件通信。因此,现有技术存在适应性不佳的问题。

发明内容

[0006] 基于此,有必要针对上述技术问题,提供一种能够支持众核处理器大规模并发通信的软硬件协同机制的面向众核处理器的并发通信方法、装置、计算机设备和存储介质。
[0007] 一种面向众核处理器的并发通信方法,所述方法包括:
[0008] 基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;
[0009] 由发送端程序通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;
[0010] 由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;
[0011] 由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;
[0012] 由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;
[0013] 由所述接收端程序通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。
[0014] 在其中一个实施例中,所述第一虚拟端口对应的网卡芯片中还设置了所述报文发送缓冲区的信用值,在将要发送的数据封装为传输层报文写入所述报文发送缓冲区之前,还包括:
[0015] 通过检查所述报文发送缓冲区的信用值判断所述报文发送缓冲区中是否还有存储空间,若没有,则返回错误信息。
[0016] 在其中一个实施例中,还包括:将要发送的数据切分成传输层报文中的数据载荷;所述数据载荷大小为112字节;
[0017] 将所述数据载荷封装为传输层报文写入所述报文发送缓冲区;所述传输层报文为128字节,包括112字节的数据载荷、8字节报文头和8字节报文尾。
[0018] 在其中一个实施例中,还包括:通过发送端程序访问所述报文发送缓冲区的写指针;所述报文发送缓冲区写指针指向所述报文发送缓冲区队列队首;
[0019] 在所述报文发送缓冲区队列队首写入所述传输层报文。
[0020] 在其中一个实施例中,所述第一虚拟端口对应的网卡芯片中还设置了硬件动态共享缓冲区,由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程时,还包括:
[0021] 在多个发送端进程向各自虚拟端口的报文发送缓冲区中写入数据时,所述报文发送缓冲区中的数据将从主存写入所述硬件动态共享缓冲区中。
[0022] 在其中一个实施例中,还包括:通过所述接收端程序通过所述报文接收缓冲区的读指针访问所述报文接收缓冲区队列队尾,读取所述报文接收缓冲区队尾的数据。
[0023] 在其中一个实施例中,还包括:所述报文发送缓冲区的大小由分别配置的基地址和上界地址确定,大小可变,但最大不超过8M字节;所述报文发送缓冲区的所述基地址和所述上界地址存储在所述网卡芯片中;
[0024] 所述报文接收缓冲区的大小由分别配置的基地址和上界地址确定,大小可变,但最大不超过8M字节;所述报文接收缓冲区的所述基地址和所述上界地址存储在所述网卡芯片中。
[0025] 一种面向众核处理器的并发通信装置,所述装置包括:
[0026] 第一虚拟端口确定模块,用于基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;
[0027] 数据发送模块,用于由发送端程序通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;
[0028] 网卡读取模块,用于由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;
[0029] 第二虚拟端口确定模块,用于由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;
[0030] 网卡写入模块,用于由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;
[0031] 数据接收模块,用于由所述接收端程序通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。
[0032] 一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
[0033] 基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;
[0034] 由发送端程序通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;
[0035] 由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;
[0036] 由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;
[0037] 由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;
[0038] 由所述接收端程序通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。
[0039] 一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
[0040] 基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;所述第一虚拟端口在主存中分配有专用的报文发送缓冲区;所述第一虚拟端口对应的网卡芯片中设置了所述报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;
[0041] 由发送端程序通过锁机制获取所述报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入所述报文发送缓冲区,并根据写入的报文数量更新所述报文预发送计数器的值,释放所述报文发送缓冲区的锁;
[0042] 由网卡芯片通过检测所述报文预发送计数器的值,根据所述报文发送缓冲区读指针启动传输层报文读取过程;
[0043] 由接收端进程确定用于数据接收的第二虚拟端口;所述第二虚拟端口在主存中分配有专用的报文接收缓冲区;所述第二虚拟端口对应的网卡芯片中设置了所述报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;
[0044] 由网卡芯片将接收到的数据以所述传输层报文的字节大小为单位,根据所述报文接收缓冲区写指针写入所述报文接收缓冲区,并由硬件修改所述报文预接收计数器的值;
[0045] 由所述接收端程序通过轮询所述报文预接收计数器获取所述报文接收缓冲区报文到达的信息,从所述报文接收缓冲区中读取数据,释放所述报文接收缓冲区的锁。
[0046] 上述面向众核处理器的并发通信方法、装置、计算机设备和存储介质,多个进程并发通信时,由发送端确定用于数据发送的第一虚拟端口,由发送端程序通过锁机制获取报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入报文发送缓冲区,并根据写入的报文数量更新报文预发送计数器的值,释放报文发送缓冲区的锁,由网卡芯片通过检测报文预发送计数器的值,根据报文发送缓冲区读指针启动传输层报文读取过程;数据接收时,由接收端进程确定用于数据接收的第二虚拟端口,由网卡芯片将接收到的数据以传输层报文的字节大小为单位,根据报文接收缓冲区写指针写入报文接收缓冲区,并由硬件修改报文预接收计数器的值;由接收端程序通过轮询报文预接收计数器获取报文接收缓冲区报文到达的信息,从报文接收缓冲区中读取数据,释放报文接收缓冲区的锁。本发明的有益效果如下:
[0047] 1)基于对缓冲区实施锁机制使每个进程形成独占硬件的编程视图,允许多个进程在用户空间受保护地并发访问通信硬件资源,以确保并发通信时通信操作请求处理的原子性。用户态程序无需考虑通信硬件接口的资源限制。
[0048] 2)基于网卡硬件的软硬件协同虚拟端口队列状态管理机制,具有很低的软件层开销,提高了内存中虚拟端口队列的利用效率与访问性能,提高了报文读写速度。

附图说明

[0049] 图1为一个实施例中面向众核处理器的并发通信方法的流程示意图;
[0050] 图2为一个实施例中软硬件结构图;
[0051] 图3为一个实施例中报文数据结构示意图;
[0052] 图4为一个实施例中发送端软硬件交互图;
[0053] 图5为一个实施例中虚拟端口与硬件缓冲区示意图;
[0054] 图6为一个实施例中接收端软硬件交互图;
[0055] 图7为一个实施例中发送端软件流程图;
[0056] 图8为一个实施例中接收端软件流程图;
[0057] 图9为一个实施例中面向众核处理器的并发通信装置的结构框图;
[0058] 图10为一个实施例中计算机设备的内部结构图。

具体实施方式

[0059] 为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
[0060] 在一个实施例中,如图1所示,提供了一种面向众核处理器的并发通信方法,包括以下步骤:
[0061] 步骤102,基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口。
[0062] 本发明中算法中涉及的程序调用和资源访问的软硬件结构包括:
[0063] MPI程序:用户编写的并行程序;
[0064] 用户态接口函数:传输层报文的接收和发送程序接口;
[0065] 内核态驱动程序:对网络接口物理通信资源进行管理的内核函数;
[0066] 虚拟端口:报文发送、接收队列,以及管理队列的指针、计数器等。
[0067] 这些程序之间的逻辑结构关系如图2所示。
[0068] 发送端发送报文首先需要发送端进程获取虚拟端口访问权限,包括:
[0069] 1)查询网络设备数量;
[0070] 2)指定设备号,打开网络设备;
[0071] 3)根据用户指定的虚拟端口号,创建软件端点,软件端点对应虚拟端口;
[0072] 4)通过锁机制获得虚拟端口中报文发送缓冲区的访问权限。
[0073] 第一虚拟端口在主存中分配有专用的报文发送缓冲区;第一虚拟端口对应的网卡芯片中设置了报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针。
[0074] 软件端点是一种用户态程序可以操作的数据结构,这种数据结构中包含了虚拟端口的缓冲区地址等信息,可以通过这种数据结构对虚拟端口执行访问和修改操作。
[0075] 网卡芯片中设置了传输层报文预发送计数器(Counter),用于记录报文发送队列中未处理的报文个数。当报文写入缓冲区后,同时将写入的报文数量写到计数器中。网卡芯片通过检测计数器的值,启动传输层报文读取过程,从而进行数据传输。
[0076] 在网卡芯片中设置了报文发送缓冲区读指针的寄存器,用于记录网卡下一次从报文缓冲区中读取报文的内存地址。网卡每读取一个报文,硬件就将计数器减1。
[0077] 报文发送缓冲区的大小由用户分别配置的基地址(Base_Address)和上界地址(Upper_Address)决定,大小可变,但最大不超过8M字节,即最多支持64K个传输层报文。基地址和上界地址会写入网卡芯片的寄存器中,以便网卡访存。
[0078] 步骤104,由发送端程序通过锁机制获取报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入报文发送缓冲区,并根据写入的报文数量更新报文预发送计数器的值,释放报文发送缓冲区的锁。
[0079] 锁机制使得每个进程形成独占硬件的编程视图,允许多个进程在用户空间受保护地并发访问通信硬件资源,以确保并发通信时通信操作请求处理的原子性。用户态程序无需考虑通信硬件接口的资源限制。
[0080] 发送端进程首先将要发送的数据切分成传输层报文中的数据载荷,每个数据载荷大小为112字节。然后数据载荷被封装为传输层报文写入虚拟端口的报文发送缓冲区。每个传输层报文为128字节,其中数据载荷之外的16字节分别8字节报文头和8字节报文尾。传输层报文结构如图3所示。
[0081] 步骤106,由网卡芯片通过检测报文预发送计数器的值,根据报文发送缓冲区读指针启动传输层报文读取过程。
[0082] 网卡芯片通过DMA读的方式从报文发送缓冲区读取传输层报文。
[0083] 步骤108,由接收端进程确定用于数据接收的第二虚拟端口。
[0084] 接收端接收报文首先需要接收端进程获取虚拟端口访问权限,包括:
[0085] 1)查询网络设备数量;
[0086] 2)指定设备号,打开网络设备;
[0087] 3)根据用户指定的虚拟端口号,创建软件端点,软件端点对应虚拟端口;
[0088] 4)通过锁机制获得网络设备中报文接收缓冲区的访问权限。
[0089] 第二虚拟端口在主存中分配有专用的报文接收缓冲区;第二虚拟端口对应的网卡芯片中设置了报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针。
[0090] 网卡芯片中设置了报文预接收计数器(Message Counter),用于记录报文接收缓冲区中未处理的报文个数。当网卡向报文接收缓冲区写入一个报文,此计数器加1。
[0091] 步骤110,由网卡芯片将接收到的数据以传输层报文的字节大小为单位,根据报文接收缓冲区写指针写入报文接收缓冲区,并由硬件修改报文预接收计数器的值。
[0092] 网卡将接收到的消息以128字节为单位,写入虚拟端口的报文接收缓冲区。每个虚拟端口都在主存中分配了专用的报文接收缓冲区。报文接收缓冲区的大小由用户分别配置的基地址(Base_Address)和上界地址(Upper_Address)决定,大小可变,但最大不超过8M字节,即最多支持64K个传输层报文。基地址和上界地址会写入网卡芯片的寄存器中,以便网卡访存。
[0093] 接收端进程从接收缓冲区中读取N个报文后,需要向报文预接收计数器执行写操作,减去N。程序中还需要维护接收缓冲区的读指针,读取报文后,对读指针进行修改。
[0094] 步骤112,由接收端程序通过轮询报文预接收计数器获取报文接收缓冲区报文到达的信息,从报文接收缓冲区中读取数据,释放报文接收缓冲区的锁。
[0095] 当传输层报文写入报文发送缓冲区后,软件将此缓冲区队列的写指针加1。这里的1代表报文大小,即128字节。
[0096] 上述面向众核处理器的并发通信方法中,在发送端进程和接收端进程发送和接收报文数据时,分别为虚拟端口在主存中设置报文发送缓冲区和报文接收缓冲区,并通过锁机制获得虚拟端口缓冲区的访问权限,发送或接收完成时释放缓冲区的锁,并在网卡芯片设置缓冲区的计数器和读指针或写指针,由发送端或接收端软件和网卡硬件协同构成虚拟端口队列状态管理机制。本发明可以支持每个进程形成独占硬件的编程视图,允许多个进程在用户空间受保护地并发访问通信硬件资源,以确保并发通信时通信操作请求处理的原子性,用户态程序无需考虑通信硬件接口的资源限制。此外,基于网卡硬件的软硬件协同虚拟端口队列状态管理机制,提高了内存中虚拟端口队列的利用效率与访问性能,提高了报文读写速度。
[0097] 在其中一个实施例中,还包括:通过发送端程序访问报文发送缓冲区的写指针;报文发送缓冲区写指针指向报文发送缓冲区队列队首;在报文发送缓冲区队列队首写入传输层报文。
[0098] 当传输层报文写入报文发送缓冲区后,软件将此缓冲区队列的写指针加1。这里的1代表报文大小,本实施例中为128字节。
[0099] 在其中一个实施例中,如图4所示,发送端处理器进程访问写指针,其中写指针的值存储在创建的软件端点中,根据写指针在报文发送缓冲区写入报文信息。报文发送缓冲区预先设定了基地址和地址上界,基地址和地址上界存储在网卡芯片中。网卡芯片中存储了信用值、读指针、报文发送缓冲区的计数器,以及设置了硬件缓冲区。
[0100] 具体地,第一虚拟端口对应的网卡芯片中还设置了报文发送缓冲区的信用值,在将要发送的数据封装为传输层报文写入报文发送缓冲区之前,还包括:通过检查报文发送缓冲区的信用值判断报文发送缓冲区中是否还有存储空间,若没有,则返回错误信息。
[0101] 第一虚拟端口对应的网卡芯片中还设置了硬件动态共享缓冲区,由网卡芯片通过检测报文预发送计数器的值,根据报文发送缓冲区读指针启动传输层报文读取过程时,还包括:在多个发送端进程向各自虚拟端口的报文发送缓冲区中写入数据时,所述报文发送缓冲区中的数据将从主存写入所述硬件动态共享缓冲区中。
[0102] 硬件动态共享缓冲区,能够形成基于硬件动态共享缓冲区的层次式消息缓存机制。这种机制中,每个硬件动态共享缓冲区对应多个虚拟端口的报文发送缓冲区队列,以快速处理大量进程需要发送的报文。大量进程同时创建了端点时,多个虚拟端口中都写入了数据,进而产生了大量数据处理需求。如果没有硬件动态共享缓冲区,则网卡芯片需要多次访问主存才能处理多个虚拟端口的数据。通过设置访问速度更快的硬件动态共享缓冲区,可以减少这一开销。虚拟端口与硬件动态共享缓冲区的关系示意如图5所示。
[0103] 基于硬件动态共享缓冲区的层次式消息缓存机制,在有限的硬件资源条件下,实现了对大量虚拟端口消息的最大化片上缓存。
[0104] 在其中一个实施例中,还包括:通过接收端程序通过报文接收缓冲区的读指针访问报文接收缓冲区队列队尾,读取报文接收缓冲区队尾的数据。
[0105] 在其中一个实施例中,如图6所示,接收端处理器进程访问报文接收缓冲区的读指针,其中读指针的值存储在创建的软件端点中,从报文接收缓冲区中读取数据。报文接收缓冲区的基地址和地址上界存储在网卡芯片中,网卡芯片中还存储了报文接收缓冲区的写指针和计数器。
[0106] 在一个具体实施例中,提供了一种面向众核处理器的并发通信方法,包括:
[0107] 第一步,发送端进程获取虚拟端口访问权限,包括以下步骤(过程如图7所示):
[0108] 1.1 查询网络设备数量;
[0109] 1.2 指定设备号,打开网络设备;
[0110] 1.3 根据用户指定的虚拟端口号,创建软件端点,软件端点对应虚拟端口;
[0111] 1.4 通过锁机制获得虚拟端口中报文发送缓冲区的访问权限;
[0112] 第二步,进程发送报文,包括以下步骤(过程如图7所示):
[0113] 2.1 检查报文发送缓冲区的信用值,看是否还有存储空间以存储传输层报文,若有,则继续,否则将返回错误信息;
[0114] 2.2 报文发送缓冲区的数据结构为队列,程序访问缓冲区写指针,写指针指向缓冲区队列队首,在报文发送缓冲区队列队首写入报文信息;
[0115] 2.3 修改发送缓冲区队列写指针以及当前缓冲区计数器,释放报文发送缓冲区的锁;
[0116] 第三步,接收端进程获取虚拟端口访问权限,包括以下步骤(过程如图8所示):
[0117] 3.1 查询网络设备数量;
[0118] 3.2 指定设备号,打开网络设备;
[0119] 3.3 根据用户指定的虚拟端口号,创建软件端点,软件端点对应虚拟端口;
[0120] 3.4 通过锁机制获得网络设备中报文接收缓冲区的访问权限;
[0121] 第四步,接收端读取报文,包括以下步骤(过程如图8所示);
[0122] 4.1接收端在一定时间内等待报文,在超时范围内,当报文接收缓冲区接收到报文时,由硬件修改缓冲区计数器,软件通过轮询计数器获取接收端缓冲区报文到达的信息,返回报文成功接收的信号;
[0123] 4.2 软件程序通过报文接收缓冲区读指针访问缓冲区队列队尾,读取报文接收缓冲区队尾的数据;
[0124] 4.3 软件程序修改接收缓冲区队列读指针,修改报文接收计数器,释放报文接收缓冲区的锁。
[0125] 应该理解的是,虽然图1、图7、图8的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1、图7、图8中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
[0126] 在一个实施例中,如图9所示,提供了一种面向众核处理器的并发通信装置,包括:第一虚拟端口确定模块902、数据发送模块904、网卡读取模块906、第二虚拟端口确定模块
908、网卡写入模块910和数据接收模块912,其中:
[0127] 第一虚拟端口确定模块902,用于基于众核处理器的高性能计算机系统中多个进程并发通信时,由发送端进程确定用于数据发送的第一虚拟端口;第一虚拟端口在主存中分配有专用的报文发送缓冲区;第一虚拟端口对应的网卡芯片中设置了报文发送缓冲区的报文预发送计数器和报文发送缓冲区读指针;
[0128] 数据发送模块904,用于由发送端程序通过锁机制获取报文发送缓冲区的访问权限后,将要发送的数据封装为传输层报文写入报文发送缓冲区,并根据写入的报文数量更新报文预发送计数器的值,释放报文发送缓冲区的锁;
[0129] 网卡读取模块906,用于由网卡芯片通过检测报文预发送计数器的值,根据报文发送缓冲区读指针启动传输层报文读取过程;
[0130] 第二虚拟端口确定模块908,用于由接收端进程确定用于数据接收的第二虚拟端口;第二虚拟端口在主存中分配有专用的报文接收缓冲区;第二虚拟端口对应的网卡芯片中设置了报文接收缓冲区的报文预接收计数器和报文接收缓冲区写指针;
[0131] 网卡写入模块910,用于由网卡芯片将接收到的数据以传输层报文的字节大小为单位,根据报文接收缓冲区写指针写入报文接收缓冲区,并由硬件修改报文预接收计数器的值;
[0132] 数据接收模块912,用于由接收端程序通过轮询报文预接收计数器获取报文接收缓冲区报文到达的信息,从报文接收缓冲区中读取数据,释放报文接收缓冲区的锁。
[0133] 数据发送模块904还用于通过检查报文发送缓冲区的信用值判断报文发送缓冲区中是否还有存储空间,若没有,则返回错误信息。
[0134] 数据发送模块904还用于将要发送的数据切分成传输层报文中的数据载荷;数据载荷大小为112字节;将数据载荷封装为传输层报文写入报文发送缓冲区;传输层报文为128字节,包括112字节的数据载荷、8字节报文头和8字节报文尾。
[0135] 数据发送模块904还用于通过发送端程序访问报文发送缓冲区的写指针;报文发送缓冲区写指针指向报文发送缓冲区队列队首;在报文发送缓冲区队列队首写入传输层报文。
[0136] 网卡读取模块906还用于在多个发送端进程向各自虚拟端口的报文发送缓冲区中写入数据时,所述报文发送缓冲区中的数据将从主存写入所述硬件动态共享缓冲区中。
[0137] 数据接收模块912还用于通过接收端程序通过报文接收缓冲区的读指针访问报文接收缓冲区队列队尾,读取报文接收缓冲区队尾的数据。
[0138] 关于面向众核处理器的并发通信装置的具体限定可以参见上文中对于面向众核处理器的并发通信方法的限定,在此不再赘述。上述面向众核处理器的并发通信装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
[0139] 在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图10所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种面向众核处理器的并发通信方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
[0140] 本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0141] 在一个实施例中,提供了一种计算机设备,包括存储器和处理器,该存储器存储有计算机程序,该处理器执行计算机程序时实现上述方法实施例中的步骤。
[0142] 在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例中的步骤。
[0143] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
[0144] 以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0145] 以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。