内存之间不能够直接复制是受限于什么?

IvanLee
IvanLee 2015-10-20 字数 174

本人不是搞体系结构的,想问一下这个问题。

内存之间无法直接复制数据,是因为没有这个必要,还是说做起来比较难?

专门领域有没有这种系统,能够通过在Memory controler中增强功能实现吗?

CSArch 计算机体系结构
1 个Like
42 个回复
yswzing
yswzing 2015-10-20

见过有些SoC芯片中带DMA Controller,可以实现 lz 所说的内存(DDR)搬移。至少为什么不在 memory controller 中实现,猜测是为了减少 memory controller 的复杂性,因为需求也不是很强,memory controller又都是以通用IP的形式提供的,很少提供定制。懂行的介绍一下?

扩展到一般性的数据大块复制,lz 的问题类似于 C 语言中的 memcpy 函数硬件实现问题。这种情况下,不光是 DDR 中的数据搬移,还要考虑到 cache,以及 coherency 问题。软件实现已经 enough?有很强的需求吗?懂行的介绍一下?

yswzing
yswzing 2015-10-20

更正一下,上面说的DMA controller(DMAC)也可以支持coherency的memory copy,不光是DDR copy。

只所以一般系统中很少见到的原因,我觉得是这种DMAC一般是通过I/O通路启动的,和cpu是asynchronous的,估计一般用在特殊场景。如果通常的应用程序使用DMAC实现memcpy,则涉及到同步问题,效率反倒不如直接用CPU做memcpy。

Aquamarine
你大爷永远都是你大爷 2015-10-20

这种人工智能的硬件到现在还看不到任何希望

【 在 IvanLee (IvanLee) 的大作中提到: 】

: 本人不是搞体系结构的,想问一下这个问题。

: 内存之间无法直接复制数据,是因为没有这个必要,还是说做起来比较难?

: 专门领域有没有这种系统,能够通过在Memory controler中增强功能实现吗?

mephistoxp
Mephisto the Great 2015-10-20

请教最简单最没效率的memcpy需要哪几条汇编指令才能实现?谢谢

【 在 yswzing 的大作中提到: 】

: 见过有些SoC芯片中带DMA Controller,可以实现 lz 所说的内存(DDR)搬移。至少为什么不在 memory controller 中实现,猜测是为了减少 memory controller 的复杂性,因为需求也不是很强,memory controller又都是以通用IP的形式提供的,很少提供定制。懂行的介绍一下?

: 扩展到一般性的数据大块复制,lz 的问题类似于 C 语言中的 memcpy 函数硬件实现问题。这种情况下,不光是 DDR 中的数据搬移,还要考虑到 cache,以及 coherency 问题。软件实现已经 enough?有很强的需求吗?懂行的介绍一下?

yswzing
yswzing 2015-10-20

load, store, cmp, add, branch?

【 在 mephistoxp 的大作中提到: 】

: 请教最简单最没效率的memcpy需要哪几条汇编指令才能实现?谢谢

IvanLee
IvanLee 2015-10-20

memory controller 不是一种DMA吗?

我的出发点是今天普通PC的内存越来越大,如果我们能够在非CPU干预下实现出memcpy, 那么很多使用memcpy的地方都可以节约出CPU来,比如context switch的copy, VM 中的gc copy。这对于in-memory compute应该是一个可以尝试的方向?

【 在 yswzing 的大作中提到: 】

: 见过有些SoC芯片中带DMA Controller,可以实现 lz 所说的内存(DDR)搬移。至少为什么不在 memory controller 中实现,猜测是为了减少 memory controller 的复杂性,因为需求也不是很强,memory controller又都是以通用IP的形式提供的,很少提供定制。懂行的介绍一下?

: 扩展到一般性的数据大块复制,lz 的问题类似于 C 语言中的 memcpy 函数硬件实现问题。这种情况下,不光是 DDR 中的数据搬移,还要考虑到 cache,以及 coherency 问题。软件实现已经 enough?有很强的需求吗?懂行的介绍一下?

IvanLee
IvanLee 2015-10-20

有什么数据吗?从内存到内存的直接复制难道比从外设复制到内存难度高了n个档次?

【 在 Aquamarine 的大作中提到: 】

: 这种人工智能的硬件到现在还看不到任何希望

zkr
Just Waiting. 2015-10-20

抛砖供讨论。

内存控制器理解为协议转换器更合理:片上总线协议vs内存芯片访问协议(时序)。

内存控制器可以提供多个片内总线的端口,内部进行仲裁,etc(FPGA有此类IP)。

DMA的典型理解是数据流不通过CPU;可以是外设/内存,外设/外设,内存/内存。

DMA控制器的数据端口和CPU的数据端口从内存控制器向上看是类似的,都是总线主控。

只不过DMA控制器专注于搬运数据的密集、连续访问;CPU不一定。

不是一个东西,所以内存控制器没有集成DMA控制器的需求,也没必要。

如果搬运的数据量不大,目前体系结构下,CPU起DMA可能不划算。。。

DMA控制器访问的是物理地址。(在MMU之外,不知道VMA)

起DMA,CPU需要在物理地址保存操作信息:起始物理地址,目的物理地址,长度,etc。

之后向控制器发起DMA操作一般需要写Device Memory,可能导致清Write Buffer。(ARM)

最后如何知道DMA操作完成了?中断?自旋?

是可以实现特殊的DMA控制器,以方便零散数据搬运,(ARM+FPGA,如Zynq,etc)

实际应用中,谁来写代码?so。。。

【 在 IvanLee (IvanLee) 的大作中提到: 】

: memory controller 不是一种DMA吗?

: 我的出发点是今天普通PC的内存越来越大,

: 如果我们能够在非CPU干预下实现出memcpy, 那么很多使用memcpy的地方...

Aquamarine
你大爷永远都是你大爷 2015-10-20

你去看看BSD或者Linux内核,看看内存管理的部分,可好?

然后再看看glibc里面memcpy的实现代码。

最后才是硬件层面的,memA->cacheA->cpuA->cacheA->some-bus->cacheB-

>cpuB->cacheB->memB,或者mem-addA->cache->cpu->cache->mem-addB。

为什么让你先看代码呢?因为并不是你连几根线,数据就嗖嗖的按你的意愿传输了。

另外,我觉得这个“内存到内存的直接复制”很难理解啊,我可以理解出来两种意思。

【 在 IvanLee (IvanLee) 的大作中提到: 】

: 有什么数据吗?从内存到内存的直接复制难道比从外设复制到内存难度高了n个档次?

yswzing
yswzing 2015-10-20

memory controller一般不称作DMA。DMA指无需CPU参与即可访问DDR的机制。

memcpy需要考虑cache,不能在memory controller层次解决,可以通过DMAC解决,但是只有memcpy任务粒度较大时,才有价值。

LZ可参考 intel I/O accelerating technology,有wikipedia介绍,专用于网络处理的。

【 在 IvanLee 的大作中提到: 】

: memory controller 不是一种DMA吗?

: 我的出发点是今天普通PC的内存越来越大,如果我们能够在非CPU干预下实现出memcpy, 那么很多使用memcpy的地方都可以节约出CPU来,比如context switch的copy, VM 中的gc copy。这对于in-memory compute应该是一个可以尝试的方向?

: ...................

mephistoxp
Mephisto the Great 2015-10-21

即使不采用DMA只用轮询,数据流也不会经过CPU吧

数据流如果经过CPU就是指要先把数据复制到CPU寄存器,然后再从寄存器把数据复制到目的地

DMA应该是让控制信号的处理也不用一直占用着CPU

【 在 zkr 的大作中提到: 】

: 抛砖供讨论。

: 内存控制器理解为协议转换器更合理:片上总线协议vs内存芯片访问协议(时序)。

: 内存控制器可以提供多个片内总线的端口,内部进行仲裁,etc(FPGA有此类IP)。

: ...................

zkr
Just Waiting. 2015-10-21

没Get你的Point。

从片上总线的角度看,目前主流都实现为主从结构,从不能发请求。(PCIe不是这样?)

所以,Slave(外设/内存控制器)到Slave之间的数据搬运必须由Master发起和控制。

Master通常可以是CPU Core或DMAC。

DMAC视为经过高度优化的,功能单一的CPU未尝不可。

指令就是DMA Descriptor呗。

【 在 mephistoxp (Mephisto the Great) 的大作中提到: 】

: 即使不采用DMA只用轮询,数据流也不会经过CPU吧

: 数据流如果经过CPU就是指要先把数据复制到CPU寄存器,

: 然后再从寄存器把数据复制到目的地

: DMA应该是让控制信号的处理也不用一直占用着CPU

: ...................

hehu
Café 2015-10-21

想想CPU和GPU怎么传递数据。

【 在 IvanLee 的大作中提到: 】

: 本人不是搞体系结构的,想问一下这个问题。

: 内存之间无法直接复制数据,是因为没有这个必要,还是说做起来比较难?

: 专门领域有没有这种系统,能够通过在Memory controler中增强功能实现吗?

mephistoxp
Mephisto the Great 2015-10-21

举个例子,

从挂在pci总线上的磁盘控制器读磁盘数据到内存,

即使采用原始的轮询模式,

数据流也不用先传到CPU寄存器,然后再复制到目的内存

所以,我想说DMA相比轮询的改进,应该是在控制流的改进,而不是数据流的改进。

之前你提到“DMA的典型理解是数据流不通过CPU;可以是外设/内存,外设/外设,内存/内存。”

【 在 zkr 的大作中提到: 】

: 没Get你的Point。

: 从片上总线的角度看,目前主流都实现为主从结构,从不能发请求。(PCIe不是这样?)

: 所以,Slave(外设/内存控制器)到Slave之间的数据搬运必须由Master发起和控制。

: ...................

zkr
Just Waiting. 2015-10-21

我没用过PCI/PCIe,但是印象中,PCI/PCIe主控是有DMA控制器的。。。so。。。

DMA本身就是控制流变异步;数据流从走CPU到走DMAC么。

【 在 mephistoxp (Mephisto the Great) 的大作中提到: 】

: 标  题: Re: 内存之间不能够直接复制是受限于什么?

: 发信站: 水木社区 (Wed Oct 21 08:30:35 2015), 站内

: 举个例子,

: 从挂在pci总线上的磁盘控制器读磁盘数据到内存,

: 即使采用原始的轮询模式,

: 数据流也不用先传到CPU寄存器,然后再复制到目的内存

: 所以,我想说DMA相比轮询的改进,应该是在控制流的改进,而不是数据流的改进。

mephistoxp
Mephisto the Great 2015-10-21

你说的数据流走CPU的意思就是数据先复制到CPU寄存器,再从寄存器复制到目的地吧

我却认为不论DMA还是轮询,数据都不需要复制到CPU寄存器

DMA只是对控制流的改进

【 在 zkr 的大作中提到: 】

: 我没用过PCI/PCIe,但是印象中,PCI/PCIe主控是有DMA控制器的。。。so。。。

: DMA本身就是控制流变异步;数据流从走CPU到走DMAC么。

zkr
Just Waiting. 2015-10-21

Yep.

DMA不说了,必然不过REG。

不明确的是在当前语义下,你对“轮询”场景的定义/暗含的情形:

- 如果是Read Status Register,然后从主机主存获得由外设产生的,想要的数据:

则CPU必然预先向外设控制器提供了主机内存的Phy Mem Addr,Size,etc

此时外设-内存的数据传输是由总线控制器的DMA模块完成的,依然是DMA Access。

- 如果是指数据就在外设的Memory Space中,主机用的时候再去Load。

则该Case和当前讨论无关。

数据是怎么生成到外设的Memory里,既可能是外设的DMAC,也可能是外设的CPU。

【 在 mephistoxp (Mephisto the Great) 的大作中提到: 】

: 你说的数据流走CPU的意思就是数据先复制到CPU寄存器,再从寄存器复制到目的地吧

: 我却认为不论DMA还是轮询,数据都不需要复制到CPU寄存器

mephistoxp
Mephisto the Great 2015-10-21

还是举个例子吧

以早年的PIO模式读硬盘数据到内存,这可以作为轮询而非DMA的实际场景吗

【 在 zkr 的大作中提到: 】

: Yep.

: DMA不说了,必然不过REG。

: 不明确的是在当前语义下,你对“轮询”场景的定义/暗含的情形:

: ...................

zkr
Just Waiting. 2015-10-21

可以。

总线结构:

CPU(M) --+-- IDE (S)

+-- MEM (S)

如果IDE控制器和MEM控制器都不能主动发起总线传输(Slave),

Load IDE -> Store MEM这个操作必然是由CPU发起的(Master)。

问题细化为总线是否允许在一次传输中,让S作为SRC,且让S作为DST。

我假设总线不支持这个功能,你可能假设总线支持这个功能。

如果不支持,数据必然过M;如果支持,这不是通常理解的DMA。

PS:若可以,Show点伪代码呗。

我没深入了解过X86的总线,总线主从按AMBA假设。

【 在 mephistoxp (Mephisto the Great) 的大作中提到: 】

: 还是举个例子吧

: 以早年的PIO模式读硬盘数据到内存,这可以作为轮询而非DMA的实际场景吗