在linux中是否有任何異步memcpy函數?我希望它能與DMA協同工作,並在完成時通知我。linux中的異步memcpy?
回答
據我所知,CPU不/不能做DMA本身。所以你需要在總線上安裝一個外部硬件來爲你解決問題。
然而,大多數硬件不能滿足所有的物理內存,所以確切的memcpy克隆是不可能的,除非你有內存地址範圍非常嚴格的定義,在您的使用案例。否則內核將不得不將memcpy塊存儲到自己的內存塊本身,這將會首先破壞memcpy的複製目的:)
但是,如果您想要在不使用memcpy的情況下創建內存塊的「克隆」 (順便說一下,由於DMA內存訪問速度通常比CPU慢),您可以將內存塊發送到視頻卡並將其拉回到另一個緩衝區。您甚至可以將該塊放入視頻內存(putbitmap()?:))中,並執行硬件加速的bitblt()以實時創建副本。
你介意分享您的實際目標,使人們或許能想出聰明/更好的招數?
@ssg,我的實際目標是創建優化的視頻播放器,其中我將我的YUV數據複製到隊列中。現在複製需要2秒,如果這個複製通過DMA發生,那麼在另一個線程中,我可以做音頻解碼。 – SunnyShah 2009-11-25 16:37:34
@Sunny Shah,你應該看看可能使用共享內存的零拷貝解決方案?你爲什麼要複製這麼大的內存塊? – Dipstick 2009-11-25 16:51:50
FFMPEG輸出YUVFrame作爲解碼功能輸出。當你想要下一個YUVFrame時,它只是編輯現有的YUVFrame來創建新的YUVFrame。所以我所做的是將YUVFrame複製到緩衝區隊列中,並在隊列到來時顯示隊列。該副本大約需要7%的處理時間。 – SunnyShah 2009-11-25 17:05:14
在多核處理器或甚至只有處理器hyper-threading,您可以通過在單獨的線程中執行通常的(同步)memcpy
來滿足您的需求。我不是說這是一個好主意,只是指出顯而易見的一點。
你可以做一些戲劇與mremap。 或者你可以破解FFmpeg,爲不同的幀使用不同的緩衝區。
- 1. CUDA中的異步memcpy期間的設備同步
- 2. CUDA流,紋理綁定和異步memcpy
- 3. 異步I/O的Linux
- 4. Linux中的異步定時器
- 5. 在Linux內核中的memcpy實現
- 6. 異步定時器在Linux
- 7. 異步套接字上的Linux
- 8. C++ Linux異步HTTP POST(Boost :: asio)
- 9. 以異步模式讀取Linux串口
- 10. 異步連接和斷開與epoll(Linux)
- 11. 異步方法中的異步方法
- 12. 異步操作中的異步操作
- 13. 異步異步
- 14. 執行主機端malloc和異步主機到設備memcpy的典型方法
- 15. Linux中的Python:將用戶輸入異步放入隊列
- 16. Linux異步加密API中的RSA硬件支持?
- 17. 在Windows和Linux中的異步作業調度
- 18. 與C++中的回調異步運行linux命令
- 19. javascript中的異步回調的結構:同步異步
- 20. 嵌套的異步下載 - 異步內的異步
- 21. 異步,異步等待
- 22. 異步子視圖異步
- 23. 在Linux中如何處理異步信號?
- 24. 異步任務從api的異步任務不運行異步
- 25. 如何在Linux中通過DMA處理memcpy
- 26. memcpy--內核崩潰後memcpy
- 27. AWS Linux中的ASP.NET異常
- 28. Linux中的異常處理
- 29. 是在異步同步異步
- 30. 的std ::異步不起作用異步
什麼平臺?這是x86嗎? – 2009-11-25 20:44:33
它是ARM9處理器,飛思卡爾iMX233微控制器。 – SunnyShah 2009-11-26 02:42:35