簡體   English   中英

在C ++中復制和處理大型密集2D數組的最快方法是什么

[英]What's the fastest way to copy and manipulate large, dense 2D arrays in c++

我正在嘗試利用多核處理器來優化我的代碼,以復制任何可操作的大型密集數組。

對於復制:我有一個大的密集數組(大約6000x100000),我需要從中提取15x100000子數組來進行管道下的多個計算。 該管道包含由blas(多核)處理的許多線性代數函數。 與線性代數相比,提取數據的時間是否真的很重要是一個懸而未決的問題,但是我還是要謹慎一點,並確保數據復制得到優化。

對於操作:我有許多不同的功能,可以通過元素或行來操作數組。 最好將它們中的每一個都做為多核。

我的問題是:最好是使用正確的框架(OpenML,OpenCL),讓所有魔術發生在編譯器中,還是有好的函數/庫可以更快地做到這一點?

您的起點應該是好的舊memcpy 長期以來一直沉迷於“復制性能”的人的一些技巧。

  1. 閱讀每個程序員應該了解的內存知識
  2. 對您的系統memcpy性能進行基准測試,例如, 此處的 memcpy_bench函數。
  3. 基准的可擴展性memcpy時,它在多個核上運行如multi_memcpy_bench 這里 (除非您使用的是多插槽NUMA硬件,否則我認為多線程復制不會帶來太多好處)。
  4. 深入研究系統的memcpy實現並理解它們。 您發現大部分時間都花費在單獨的rep movsd已經一去不復返了; 上一次我查看gcc和Intel編譯器的CRT時,它們都根據副本的大小(相對於CPU的緩存大小)改變了策略。
  5. 在Intel上,了解非高速緩存污染存儲指令(例如movntps )的優勢,因為與傳統方法相比,它們可以顯着提高吞吐量 (您將在4中看到這些指令)。
  6. 可以訪問並知道如何使用抽樣探查器來確定您的應用程序在復制操作上花費了多少時間。 還有一些更高級的工具可以查看CPU性能計數器,並告訴您有關各種緩存正在執行的操作等的各種信息。
  7. (高級主題)請注意TLB以及何時可以使用大頁面

但是我的期望是,與任何linalg繁重的工作相比,您的副本所占的開銷將很小。 知道數量多少是一件好事。 我不希望OpenCL或任何適用於CPU的東西在這里神奇地提供任何改進(除非您的系統的memcpy實施不當); 恕我直言,最好是深入研究這些內容,深入了解指令,寄存器,高速緩存行和頁面一級的實際情況,而不是通過在頂層再上一層抽象來擺脫這種情況。 。

當然,如果您正在考慮將代碼從當前使用的任何多核BLAS庫移植到GPU加速的線性代數版本,這將成為一個完全不同(且更為復雜)的問題(請參見下面的JayC評論)。 如果您希望獲得實質性的性能提升,那么您當然應該考慮一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM