【问题标题】:asynchronous memcpy in linux?Linux中的异步memcpy?
【发布时间】:2010-12-20 08:39:06
【问题描述】:

linux中有没有异步memcpy函数?我希望它与 DMA 一起工作,并在完成时通知我。

【问题讨论】:

  • ARM9处理器,飞思卡尔iMX233微控制器。

标签: c linux dma


【解决方案1】:

据我所知,CPU 不能/不能对自己进行 DMA。因此,您需要总线上的外部硬件来为您解决问题。

但是,大多数硬件无法寻址所有物理内存,因此除非您在用例中对内存地址范围进行了非常严格的定义,否则无法进行精确的 memcpy 克隆。否则内核将不得不将该块存储到您自己的内存块本身,这将首先破坏克隆 memcpy 的目的:)

但是,如果您想在不使用 memcpy 的情况下创建内存块的“克隆”(顺便说一句,这仍然是个坏主意,因为 DMA 内存访问通常比 CPU 慢),您可以将内存块发送到视频卡并将其拉回另一个缓冲区。您甚至可以将块放入视频内存 (putbitmap()?:)) 并执行硬件加速 bitblt() 以动态创建副本。

您介意分享您的实际目标,以便人们可以想出更聪明/更好的技巧吗?

【讨论】:

  • @ssg,我的实际目标是创建优化的视频播放器,在其中我将我的 YUV 数据复制到它的队列中。现在复制需要 2 秒,如果这个复制是通过 DMA 发生的,那么这次在另一个线程中我可以进行音频解码。
  • @Sunny Shah,您应该考虑使用共享内存的零复制解决方案吗?你为什么要复制这么大的内存块?
  • FFMPEG 输出 YUVFrame 作为解码函数输出。当你想要下一个 YUVFrame 时,它​​只是编辑现有的 YUVFrame 来创建新的。所以我所做的是,我将 YUVFrame 复制到缓冲区队列,并在时间到来时显示队列中的帧。此副本大约需要 7% 的处理时间。
  • @SunnyShah 很抱歉迟到了 6 年,但是记忆副本怎么能花 2 秒呢?我们在谈论多少内存以及什么样的 CPU?
  • @SedatKapanoglu,嘿,我正在研究 200 Mhz ARM v5 处理器。
【解决方案2】:

在多核处理器上,甚至只是带有hyper-threading 的处理器上,您可以通过在单独的线程中执行通常的(同步)memcpy 来获得您想要的东西。我并不是说这是一个好主意,只是指出显而易见的。

【讨论】:

    【解决方案3】:

    您可以使用 mremap 进行一些操作。 或者你可以破解 FFmpeg 来为不同的帧使用不同的缓冲区。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2015-02-26
      • 1970-01-01
      • 2011-04-23
      • 2013-06-14
      • 1970-01-01
      • 2016-03-04
      • 2016-04-06
      相关资源
      最近更新 更多