ARM 可以隨便做 DMA 的記憶體-記憶體複製,但標準 x86 架構只支援記憶體-裝置的 DMA 複製,不支援記憶體-記憶體的 DMA 複製,以前有一些技巧可以讓兩個 dma channel 接在一起實現記憶體到記憶體的 DMA 複製,但是官方文件裡沒有說過可以這樣做,並不能保證可以再未來的裝置下這麼做。
現在的話,可以用 intel 的 I/OAT 技術進行非同步記憶體複製了,直接使用 SPDK:
可以看出 DMA 複製效能比 CPU 差很多,但是就是可以並行:
這個雖然並行,但是比 CPU memcpy 慢很多的結果不知道你是否能接受?會不會你cpu都算完好幾遍了,最後卡在等 DMA 傳輸結果上?如果這樣的話,用不用都無所謂了。
而如果你只想一個並行複製,速度快慢容忍度比較高的話,你也不一定用這個 SPDK,你可以先非同步把資料從主存複製到視訊記憶體,再從視訊記憶體非同步複製回主存,這樣繞一圈,說不定效能和 SPDK有得一拼。你可以測試一下,如果真是這樣的話,你可以改改你的程式結構了,逐步把運算挪給gpu做去。
我以前最佳化一個錄屏程式,也是大量的記憶體複製外加一定運算,全屏抓取桌面 HDC ,縮放到記憶體裡的 DIB Section,需要33ms一幀,後來到視訊記憶體裡饒了一圈,變成 桌面 surface -> 縮放 -> 視訊記憶體surface -> 系統記憶體 surface,看著麻煩了許多,但是這個抓屏速度從 33ms 下降到了2 ms。
所以你可以多測試下,考慮下你的計算程式是否可以用別的方式實現。
ARM 可以隨便做 DMA 的記憶體-記憶體複製,但標準 x86 架構只支援記憶體-裝置的 DMA 複製,不支援記憶體-記憶體的 DMA 複製,以前有一些技巧可以讓兩個 dma channel 接在一起實現記憶體到記憶體的 DMA 複製,但是官方文件裡沒有說過可以這樣做,並不能保證可以再未來的裝置下這麼做。
現在的話,可以用 intel 的 I/OAT 技術進行非同步記憶體複製了,直接使用 SPDK:
Fast memcpy with SPDK and Intel® I/OAT DMA Engine可以看出 DMA 複製效能比 CPU 差很多,但是就是可以並行:
這個雖然並行,但是比 CPU memcpy 慢很多的結果不知道你是否能接受?會不會你cpu都算完好幾遍了,最後卡在等 DMA 傳輸結果上?如果這樣的話,用不用都無所謂了。
而如果你只想一個並行複製,速度快慢容忍度比較高的話,你也不一定用這個 SPDK,你可以先非同步把資料從主存複製到視訊記憶體,再從視訊記憶體非同步複製回主存,這樣繞一圈,說不定效能和 SPDK有得一拼。你可以測試一下,如果真是這樣的話,你可以改改你的程式結構了,逐步把運算挪給gpu做去。
我以前最佳化一個錄屏程式,也是大量的記憶體複製外加一定運算,全屏抓取桌面 HDC ,縮放到記憶體裡的 DIB Section,需要33ms一幀,後來到視訊記憶體裡饒了一圈,變成 桌面 surface -> 縮放 -> 視訊記憶體surface -> 系統記憶體 surface,看著麻煩了許多,但是這個抓屏速度從 33ms 下降到了2 ms。
所以你可以多測試下,考慮下你的計算程式是否可以用別的方式實現。