[英]What's the fastest way to copy and manipulate large, dense 2D arrays in c++
我正在嘗試利用多核處理器來優化我的代碼,以復制任何可操作的大型密集數組。
對於復制:我有一個大的密集數組(大約6000x100000),我需要從中提取15x100000子數組來進行管道下的多個計算。 該管道包含由blas(多核)處理的許多線性代數函數。 與線性代數相比,提取數據的時間是否真的很重要是一個懸而未決的問題,但是我還是要謹慎一點,並確保數據復制得到優化。
對於操作:我有許多不同的功能,可以通過元素或行來操作數組。 最好將它們中的每一個都做為多核。
我的問題是:最好是使用正確的框架(OpenML,OpenCL),讓所有魔術發生在編譯器中,還是有好的函數/庫可以更快地做到這一點?
您的起點應該是好的舊memcpy
。 長期以來一直沉迷於“復制性能”的人的一些技巧。
memcpy
性能進行基准測試,例如, 此處的 memcpy_bench
函數。 memcpy
時,它在多個核上運行如multi_memcpy_bench
這里 。 (除非您使用的是多插槽NUMA硬件,否則我認為多線程復制不會帶來太多好處)。 rep movsd
已經一去不復返了; 上一次我查看gcc和Intel編譯器的CRT時,它們都根據副本的大小(相對於CPU的緩存大小)改變了策略。 movntps
)的優勢,因為與傳統方法相比,它們可以顯着提高吞吐量 (您將在4中看到這些指令)。 但是我的期望是,與任何linalg繁重的工作相比,您的副本所占的開銷將很小。 知道數量多少是一件好事。 我不希望OpenCL或任何適用於CPU的東西在這里神奇地提供任何改進(除非您的系統的memcpy實施不當); 恕我直言,最好是深入研究這些內容,深入了解指令,寄存器,高速緩存行和頁面一級的實際情況,而不是通過在頂層再上一層抽象來擺脫這種情況。 。
當然,如果您正在考慮將代碼從當前使用的任何多核BLAS庫移植到GPU加速的線性代數版本,這將成為一個完全不同(且更為復雜)的問題(請參見下面的JayC評論)。 如果您希望獲得實質性的性能提升,那么您當然應該考慮一下。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.