dma 做内存拷贝是不是总是快于 CPU 内存拷贝?

leslielg 2017-07-25 04:43:53
还是我需要在每个平台上都做下测试?才能选择出最佳性能的 RAM 到 RAM的拷贝方式?
...全文
1702 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
leslielg 2017-08-04
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
无需测试,DMA肯定比CPU快,简单的说,CPU必须从外设读一个数据到寄存器,再将寄存器写到一个内存,而DMA设置好移动数据的内存目标地址等参数后,DMA控制器直接产生地址,数据源源不断的移动 至于ls说CPU可以做别的事情,基本是不可能的,因为DMA运行的时候,地址总线数据总线都会被占用,CPU是无法运行的
CPU在DMA期间无法响应的话,这样的DMA设计是无法使用的。x86和arm都不会采用这样的设计,系统实时性完全没有了。你说的不对。 而且DMA设计的目的就是释放CPU去做其它事情,来达成异步的效果。
leslielg 2017-08-04
  • 打赏
  • 举报
回复
引用 17 楼 of123 的回复:
[quote=引用 12 楼 leslielg 的回复:] [quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote] 你说的是总线仲裁,跟我问你的答非所问啊。我之所以倾向用CPU就是因为有总线仲裁所以DMA的传输会被CPU干扰,而CPU的实时操作又会被DMA的传输干扰(因为DMA的总线仲裁权高于CPU). 按你之前的说法,DMA可以在一次内存访问就同时完成内存的读和写。就是你这里写的“抓”,我想知道的就是这个抓的定义。它的行为到底是DMA把内存数据读到DMA的寄存器,再从DMA寄存器写到内存;还是DMA能够直接把内存的一个数据搬运到另一个内存地址,而且是在一次访存周期里完成?如果是后者,那么CPU为何没有相关“抓”的指令,如果有这个指令,那PC和手机等等设备的性能岂不是可以大幅提升?麻烦直接回答下,别再引入你自定义的词语和类比了,很难理解。。。[/quote] 是你的理解能力问题。 数据从源到目的复制过程,就是将源数据放上总线,使目的将总线数据写入。 通过 CPU 的过程,至少需要 2 个这样的过程。而通过 DMA 只需要 1 个。 思考硬件的执行过程,不要总纠结汇编指令。实际上,每一个指令的实现都是由多个机器操作组成,每一个指令的执行时钟周期也都可能各不相同。 另外,DMA 的执行过程也不依赖于指令。例如,我公司设计的多款芯片中的 DMA 模块,使用机器指令(当然一般情况下源码还是 C)设置好控制寄存器并启动后,就是由硬件来执行传输操作。 在单片机中,为了简化,DMA 就是抢占总线的,不存在 CPU 在 DMA 时进行其他操作的情况。另外,你即便是用 CPU 复制数据,只要你的代码中不插入其他操作,CPU 也不会“做其他工作”。但它就是埋头苦干,也还是干不赢 DMA。这是它的操作机制决定的。 你完全可以设计一款支持“DMA 指令”的芯片。 但是,一般情况下,单片机的 CPU 核与其外设,不是一家公司设计到底的。大公司往往向其他设计公司提供成型的 CPU 核 IP。而包括 DMA 的外设,是由接受 IP 的公司设计的。最终形成完整的单片机。 这就是为什么没有 DMA 指令的原因。也是 DMA 一定快过 CPU 传输的另一佐证。不然的话,人家为什么要设计 DMA? 如果你还是无法理解,我也无能为力了。毕竟,每一个人的理解力有差别,我的表述能力有限。 [/quote] 我的理解并没有问题,而是你片面的认为了CPU和DMA的工作程序。 前面jklinux的回复我认为说的比较清楚了: CISC架构的x86是有内存到内存的搬运指令的,在这种情况下CPU和DMA速度相当。 RISC架构的ARM没有这类指令,CPU拷贝速度低于DMA。 另外ARM给出了拷贝的对比测试,使用NEON+preload指令的memcpy性能是CPU memcpy的150%。DMA是否能使用preload指令不太清楚,具体性能多少没有相关的数据。 另外cache是否会影响两者的运行性能? 你提到的单片机,我不清楚具体指什么型号的芯片,概念太笼统。但是ARM的DMA是不会独占总线的。CPU总有机会和DMA做总线仲裁,否则DMA就完全不能使用了,在DMA拷贝期间彻底失去响应是不能接受的,特别是嵌入式芯片,会完全丧失实时性。我不认为存在这样的设计,特别是通用芯片。 即使有总线仲裁,使用DMA也降低了系统的实时性。 设计DMA的主要原因是耗时拷贝时可以释放CPU做其它事情,然而不在我这个对比拷贝速度的讨论范围内。
hello_mcu 2017-08-03
  • 打赏
  • 举报
回复
我是来学习的,看各位的辩论解答,实在受益。
csdn一绝 2017-08-03
  • 打赏
  • 举报
回复
内存拷贝只是CPU干的事,DMA方式是CPU与外设之间传输数据的中间设备,为了缓解慢速设备与CPU快速的传输不相符才出现DMA,两者是独立存在的,CPU有CPU的总线连接内存,DMA有DMA的总线连接内存,速度上相对来说CPU快。
worldy 2017-08-02
  • 打赏
  • 举报
回复
引用 17 楼 of123 的回复:
[quote=引用 12 楼 leslielg 的回复:] [quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote] 你说的是总线仲裁,跟我问你的答非所问啊。我之所以倾向用CPU就是因为有总线仲裁所以DMA的传输会被CPU干扰,而CPU的实时操作又会被DMA的传输干扰(因为DMA的总线仲裁权高于CPU). 按你之前的说法,DMA可以在一次内存访问就同时完成内存的读和写。就是你这里写的“抓”,我想知道的就是这个抓的定义。它的行为到底是DMA把内存数据读到DMA的寄存器,再从DMA寄存器写到内存;还是DMA能够直接把内存的一个数据搬运到另一个内存地址,而且是在一次访存周期里完成?如果是后者,那么CPU为何没有相关“抓”的指令,如果有这个指令,那PC和手机等等设备的性能岂不是可以大幅提升?麻烦直接回答下,别再引入你自定义的词语和类比了,很难理解。。。[/quote] 是你的理解能力问题。 数据从源到目的复制过程,就是将源数据放上总线,使目的将总线数据写入。 通过 CPU 的过程,至少需要 2 个这样的过程。而通过 DMA 只需要 1 个。 思考硬件的执行过程,不要总纠结汇编指令。实际上,每一个指令的实现都是由多个机器操作组成,每一个指令的执行时钟周期也都可能各不相同。 另外,DMA 的执行过程也不依赖于指令。例如,我公司设计的多款芯片中的 DMA 模块,使用机器指令(当然一般情况下源码还是 C)设置好控制寄存器并启动后,就是由硬件来执行传输操作。 在单片机中,为了简化,DMA 就是抢占总线的,不存在 CPU 在 DMA 时进行其他操作的情况。另外,你即便是用 CPU 复制数据,只要你的代码中不插入其他操作,CPU 也不会“做其他工作”。但它就是埋头苦干,也还是干不赢 DMA。这是它的操作机制决定的。 你完全可以设计一款支持“DMA 指令”的芯片。 但是,一般情况下,单片机的 CPU 核与其外设,不是一家公司设计到底的。大公司往往向其他设计公司提供成型的 CPU 核 IP。而包括 DMA 的外设,是由接受 IP 的公司设计的。最终形成完整的单片机。 这就是为什么没有 DMA 指令的原因。也是 DMA 一定快过 CPU 传输的另一佐证。不然的话,人家为什么要设计 DMA? 如果你还是无法理解,我也无能为力了。毕竟,每一个人的理解力有差别,我的表述能力有限。 [/quote]
of123 2017-07-31
  • 打赏
  • 举报
回复
引用 12 楼 leslielg 的回复:
[quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote] 你说的是总线仲裁,跟我问你的答非所问啊。我之所以倾向用CPU就是因为有总线仲裁所以DMA的传输会被CPU干扰,而CPU的实时操作又会被DMA的传输干扰(因为DMA的总线仲裁权高于CPU). 按你之前的说法,DMA可以在一次内存访问就同时完成内存的读和写。就是你这里写的“抓”,我想知道的就是这个抓的定义。它的行为到底是DMA把内存数据读到DMA的寄存器,再从DMA寄存器写到内存;还是DMA能够直接把内存的一个数据搬运到另一个内存地址,而且是在一次访存周期里完成?如果是后者,那么CPU为何没有相关“抓”的指令,如果有这个指令,那PC和手机等等设备的性能岂不是可以大幅提升?麻烦直接回答下,别再引入你自定义的词语和类比了,很难理解。。。[/quote] 是你的理解能力问题。 数据从源到目的复制过程,就是将源数据放上总线,使目的将总线数据写入。 通过 CPU 的过程,至少需要 2 个这样的过程。而通过 DMA 只需要 1 个。 思考硬件的执行过程,不要总纠结汇编指令。实际上,每一个指令的实现都是由多个机器操作组成,每一个指令的执行时钟周期也都可能各不相同。 另外,DMA 的执行过程也不依赖于指令。例如,我公司设计的多款芯片中的 DMA 模块,使用机器指令(当然一般情况下源码还是 C)设置好控制寄存器并启动后,就是由硬件来执行传输操作。 在单片机中,为了简化,DMA 就是抢占总线的,不存在 CPU 在 DMA 时进行其他操作的情况。另外,你即便是用 CPU 复制数据,只要你的代码中不插入其他操作,CPU 也不会“做其他工作”。但它就是埋头苦干,也还是干不赢 DMA。这是它的操作机制决定的。 你完全可以设计一款支持“DMA 指令”的芯片。 但是,一般情况下,单片机的 CPU 核与其外设,不是一家公司设计到底的。大公司往往向其他设计公司提供成型的 CPU 核 IP。而包括 DMA 的外设,是由接受 IP 的公司设计的。最终形成完整的单片机。 这就是为什么没有 DMA 指令的原因。也是 DMA 一定快过 CPU 传输的另一佐证。不然的话,人家为什么要设计 DMA? 如果你还是无法理解,我也无能为力了。毕竟,每一个人的理解力有差别,我的表述能力有限。
jklinux 2017-07-30
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
无需测试,DMA肯定比CPU快,简单的说,CPU必须从外设读一个数据到寄存器,再将寄存器写到一个内存,而DMA设置好移动数据的内存目标地址等参数后,DMA控制器直接产生地址,数据源源不断的移动 至于ls说CPU可以做别的事情,基本是不可能的,因为DMA运行的时候,地址总线数据总线都会被占用,CPU是无法运行的
我有点疑惑,x86里不是有可以直接内存操作的汇编指令么?       dma操作时占用总线是的,但不可能等到dma整个传输结束后才释放总线的吧,如果传输时间长,整个系统不都没响应了? 再如指令或数据在dma占用总线前读取到cpu的一、二级缓存里,那么dma占用总线后, cpu可以从缓存里取指令或数据吧?
worldy 2017-07-30
  • 打赏
  • 举报
回复
无需测试,DMA肯定比CPU快,简单的说,CPU必须从外设读一个数据到寄存器,再将寄存器写到一个内存,而DMA设置好移动数据的内存目标地址等参数后,DMA控制器直接产生地址,数据源源不断的移动 至于ls说CPU可以做别的事情,基本是不可能的,因为DMA运行的时候,地址总线数据总线都会被占用,CPU是无法运行的
jklinux 2017-07-28
  • 打赏
  • 举报
回复
引用 13 楼 leslielg 的回复:
[quote=引用 11 楼 jklinux 的回复:] [quote=引用 10 楼 leslielg 的回复:] [quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote]
引用 8 楼 jklinux 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] arm架构里没法直接在内存里操作的,绝大数场合都得把数据存放寄存器后才可以运算[/quote] 那这么说ARM的DMA跟CPU拷贝是一样的速度? x86上DMA是可以直接内存到内存搬运的?[/quote] 不管是arm还是x86, dma控制器肯定是直接到内存上的数据搬移到另一个内存地址上的。 区别是用CPU搬数据. arm里的cpu得先把从内存读入的数据用寄存器存起来先,再把寄存器里的数据写到另一内存地址上。 x86的cpu可以不用寄存器存起就可以直接内存操作的。 理论上, dma控制器应是效率高点, 因cpu不可能只是搬数据吧,如果cpu有很多任务,那么分配用于搬数据的时间片可能就相对少了。 而dma是专业搬数据,不做别的事情的。 [/quote] OK,这个比较清楚了。这么说x86下CPU和DMA拷贝速度应该是一样的,瓶颈仅在于内存频率。而ARM下DMA的效率可以认为都是高于CPU的,应该是由于RISC的缘故。那NEON里有指令可以绕开寄存器缓存而直接内存到内存操作么?[/quote] “这么说x86下CPU和DMA拷贝速度应该是一样的“, 这个除非cpu只用于搬数据。 NEON就不熟悉了,但它里面也有16个128位的寄存器,操作时也时先放入这些寄存器再运算。绕开的仅仅是arm的r0~r15这些寄存器而已。
leslielg 2017-07-28
  • 打赏
  • 举报
回复
引用 11 楼 jklinux 的回复:
[quote=引用 10 楼 leslielg 的回复:] [quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote]
引用 8 楼 jklinux 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] arm架构里没法直接在内存里操作的,绝大数场合都得把数据存放寄存器后才可以运算[/quote] 那这么说ARM的DMA跟CPU拷贝是一样的速度? x86上DMA是可以直接内存到内存搬运的?[/quote] 不管是arm还是x86, dma控制器肯定是直接到内存上的数据搬移到另一个内存地址上的。 区别是用CPU搬数据. arm里的cpu得先把从内存读入的数据用寄存器存起来先,再把寄存器里的数据写到另一内存地址上。 x86的cpu可以不用寄存器存起就可以直接内存操作的。 理论上, dma控制器应是效率高点, 因cpu不可能只是搬数据吧,如果cpu有很多任务,那么分配用于搬数据的时间片可能就相对少了。 而dma是专业搬数据,不做别的事情的。 [/quote] OK,这个比较清楚了。这么说x86下CPU和DMA拷贝速度应该是一样的,瓶颈仅在于内存频率。而ARM下DMA的效率可以认为都是高于CPU的,应该是由于RISC的缘故。那NEON里有指令可以绕开寄存器缓存而直接内存到内存操作么?
leslielg 2017-07-28
  • 打赏
  • 举报
回复
引用 9 楼 of123 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote] 你说的是总线仲裁,跟我问你的答非所问啊。我之所以倾向用CPU就是因为有总线仲裁所以DMA的传输会被CPU干扰,而CPU的实时操作又会被DMA的传输干扰(因为DMA的总线仲裁权高于CPU). 按你之前的说法,DMA可以在一次内存访问就同时完成内存的读和写。就是你这里写的“抓”,我想知道的就是这个抓的定义。它的行为到底是DMA把内存数据读到DMA的寄存器,再从DMA寄存器写到内存;还是DMA能够直接把内存的一个数据搬运到另一个内存地址,而且是在一次访存周期里完成?如果是后者,那么CPU为何没有相关“抓”的指令,如果有这个指令,那PC和手机等等设备的性能岂不是可以大幅提升?麻烦直接回答下,别再引入你自定义的词语和类比了,很难理解。。。
jklinux 2017-07-28
  • 打赏
  • 举报
回复
引用 10 楼 leslielg 的回复:
[quote=引用 9 楼 of123 的回复:] [quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote]
引用 8 楼 jklinux 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] arm架构里没法直接在内存里操作的,绝大数场合都得把数据存放寄存器后才可以运算[/quote] 那这么说ARM的DMA跟CPU拷贝是一样的速度? x86上DMA是可以直接内存到内存搬运的?[/quote] 不管是arm还是x86, dma控制器肯定是直接到内存上的数据搬移到另一个内存地址上的。 区别是用CPU搬数据. arm里的cpu得先把从内存读入的数据用寄存器存起来先,再把寄存器里的数据写到另一内存地址上。 x86的cpu可以不用寄存器存起就可以直接内存操作的。 理论上, dma控制器应是效率高点, 因cpu不可能只是搬数据吧,如果cpu有很多任务,那么分配用于搬数据的时间片可能就相对少了。 而dma是专业搬数据,不做别的事情的。
leslielg 2017-07-28
  • 打赏
  • 举报
回复
引用 9 楼 of123 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。[/quote]
引用 8 楼 jklinux 的回复:
[quote=引用 7 楼 leslielg 的回复:] [quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] arm架构里没法直接在内存里操作的,绝大数场合都得把数据存放寄存器后才可以运算[/quote] 那这么说ARM的DMA跟CPU拷贝是一样的速度? x86上DMA是可以直接内存到内存搬运的?
of123 2017-07-27
  • 打赏
  • 举报
回复
引用 7 楼 leslielg 的回复:
[quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] 这么跟你解释吧。常规的芯片中,只有 CPU 是“活的”。从 RAM 读是它从 RAM 拿;向 RAM 写,是他向 RAM 放。 也就是说,在一个时刻,只能有一个主体握有总线的控制权。常规下,它就是 CPU。 DAM 是另一个主体。当它要干活之前,它要和 CPU “商量”好,暂时总线归我管,你先歇歇。然后,它把数据从源“抓”到目的。干完后,它再对 CPU 说,好了哥们儿,现在总线归你了。 指令都是给 CPU 写的,也没有包含总线协商机制。一般情况下,DMA 是一个独立的模块,它有专用的操作机制。
leslielg 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 jklinux 的回复:
dma的作用并不是说搬数据比cpu搬的快, 而是dma在搬数据的同时,cpu可以作别的事情. 而且这两者也会互相影响的,dma搬数据和cpu取数据时都需要使用系统的数据总线进行传输数据,而数据总线某一时该只能给一方独占使用,所以在以前性能比较垃圾的pc上播放歌典时复制硬盘数据会发生断断续续的问题.
我的问题是: 当DMA和CPU比拷数据的速度的时候,有没有某种机制会保证DMA速度不小于CPU?因为我不想一段拷贝代码在一个平台上是用DMA,另一个平台又要用CPU了。
leslielg 2017-07-26
  • 打赏
  • 举报
回复
引用 2 楼 of123 的回复:
肯定是 DMA 快,因为它不需要通过 CPU 中转。不必测试。
CPU中转是什么概念?CPU自己做拷贝的时候需要做什么中转么?
jklinux 2017-07-26
  • 打赏
  • 举报
回复
引用 7 楼 leslielg 的回复:
[quote=引用 5 楼 of123 的回复:] 这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?[/quote] arm架构里没法直接在内存里操作的,绝大数场合都得把数据存放寄存器后才可以运算
of123 2017-07-26
  • 打赏
  • 举报
回复
肯定是 DMA 快,因为它不需要通过 CPU 中转。不必测试。
leslielg 2017-07-26
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
另外如果总线支持这样的操作,那么CPU为什么没有指令可以直接把一个地址的值赋给另一个地址,不需要借助寄存器,而要分别用ldr str (ARM)?如果有,那编译器优化后的memcpy是不是CPU跟DMA的行为就一样了(就我看到的aarch64编译器而言,并没有对memcpy做出这样的优化指令 -O3)?
leslielg 2017-07-26
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复:
这么说吧,你有一批货,想从重庆发往深圳。你说先发到北京,再由北京发到深圳,和直接发到深圳,哪一个快? 当然了,芯片中的传输速度不是受距离影响,而是所需要的系统时钟数。常规的数据复制,是先从源地址读到 CPU 中,再从 CPU 写到目标地址。而 DMA 是直接通过总线从源传到目标。 是否能用 DMA 的确取决于平台。并不是每一个单片机都有可随意配置的 DMA 模块。另外,有些芯片的 DMA 是在线传输的,与你后期配置传输又不同。 所以,不可能有一种包打天下的方案。 其实,你可以一些宏和编译指令来处理不同芯片上的功能相似操作。也就是写多套可待换的代码,根据芯片选择性编译。 当然了,如果性能不敏感的话,你可以就用常规的通过 CPU 的转存,这是所有芯片都支持的。
这么说DMA可以在一次内存操作周期中,在总线上同时完成内存的读和写?而CPU需要两次内存操作周期分别完成,那么DMA的速度应该差不多是CPU的两倍左右? 有相关的链接讲DMA是一次操作周期就完成读和写么?
加载更多回复(2)

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧