多核编程指南(四)---进程间通信(一)

进程间通信包括两个主要操作:数据移动通知(包括同步)

本篇文章主要介绍数据移动

数据的物理移动可以通过几种不同的技术来完成:

  • 使用共享消息缓冲区—发送方和接收方可以访问相同的物理内存
  • 使用专用存储器—在专用发送和接收缓冲区之间进行传输
  • 转换的内存缓冲区—内存缓冲区的所有权由发送方提供给接收方,但内容不会转移

对于每种技术,都有两种读取和写入内存内容的方法:CPU加载/存储和DMA传输。可以将每次传输配置为不同的方法。

Shared Memory(共享内存)

使用共享内存缓存区并不一定意味着使用相同的共享内存,虽然这个很常见。但是,这意味着在发送方和和接收方都可以访问内存中设置一个消息缓冲区,每部分负责一部分事务。发送方将消息发送到共享缓冲区并通知接收方。接收方检索消息并将内容从源缓冲区复制到目标缓冲区,然后告知发送方缓冲区可用。当多个内核从共享内存访问数据时,保持一致性非常重要

Dedicated Memory(专用内存)

还可以管理发送和接收存储器之间的传输。这通常在内核为每个内核使用共享内存的专用区域或为其数据使用本地内存时使用,其中通过将数据保存到本地来减少开销。数据移动可以通过核心之间的直接通信或与KeyStone系列设备中的Multicore Navigator进行。与共享内存一样,存在通知(notification)和传输(transfer)阶段,这是通过push或pull机制来实现。

在push model中,发送方负责填充接收缓冲区,在pull model中,接收方负责从发送缓冲区检索数据。

专用内存模型(Dedicated Memory Models)
在这里插入图片描述
区别仅在于通知(notification)。通常,由于拉模型中使用的远程读取请求的开销,使用推模型。然而,如果接收机上的资源紧张,则接收机控制数据传输以允许更严格地管理其存储器可能是有利的。

使用multicore Navigator可以减少内核在实时处理过程中必须完成的工作。用于在专用存储器之间传输数据的multicore Navigator模型如下所示:

  1. 发送方使用称为描述符的预定义结构直接传递数据或指向要发送的数据缓冲区。这由描述符结构类型决定
  2. 发送方将描述符推送到与接收方关联的硬件队列
  3. 数据可供接收器使用。

Transitioned Memory(转换内存)

发送方和接收方也可以使用相同的物理内存,但与上述共享内存传输不同,公共内存不是临时的。传输的是缓冲区所有权,数据不会传输。发送方将指针传递给接收方和接收方使用原始内存缓冲区中的内容

消息序列:

  1. 发送方将数据生成到内存中
  2. 发送方通知接收方数据准备就绪/所有权已给定
  3. 接收方直接消耗内存
  4. 接收方通知发送方数据准备就绪/所有权已给定

如果适用于对称数据流,则接收方可以在返还所有权之前切换到发送方角色,并对其消息使用相同的缓冲区

Data Movement in OpenMP(在OpenMP中的数据移动)

开发者可以使用在OpenMP编译器指令中子句如private、shared和default来管理数据范围。

OpenMP编译器指令的形式为"#pragma omp construct[clause [clause]…]"。数据作用域子句后面紧跟着圆括号中的变量列表。例如"#pragma omp parallel private (i,j)"

当变量由private子句限定时,在整个并行构造中,每个线程都有变量私有副本和变量的唯一值。这些变量存储在线程堆栈中,默认大小由编译器设置,但可以重写。

当变量由共享子句限定时,所有线程都会看到该变量的相同副本。它们通常存储在DDR或MSMC等共享内存中。

默认情况下,OpenMP管理某些变量的数据范围。在并行区域之外声明的变量将自动限定为共享变量。在并行区域内声明的变量将自动限定为私有变量。其他默认情形也存在:例如,迭代计数由编译器作为私有变量自动强制执行

default子句使程序员能够覆盖分配给任何变量的默认范围。例如,可以使用default none来声明,在并行区域内部或外部声明的变量都没有分别被暗示为私有或共享的,程序员的任务是显示地指定并行区域内所有变量的范围

下面的代码示例块显示了这些数据作用域子句
在这里插入图片描述

Multicore Navigator Data Movement

Multicore Navigator封装消息,包括在称为描述符的容器中包含数据的消息,并在硬件队列之间移动它们。队列管理子系统(Queue Manager Subsystem,QMSS)是Multicore Navigator的核心部分,它控制硬件队列的行为并支持描述符的路由。称为PKTDMA的基于逻辑的DMA的多个实例在队列之间移动描述符,并与外围设备之间来回移动描述符,当一个内核想要将数据移动到另一个内核时,他会将数据放入与描述符关联的缓冲区中,并将描述符推送到队列中。所有路由和监控都在QMSS内部完成。描述符被推送到属于接收核心的队列中。

参考文献:

  1. 《Multicore Programming Guide》

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/119425822