簡體   English   中英

高性能 C++ 多維數組

[英]High-performance C++ multi-dimensional arrays

我正在尋找有關 C++ 的高性能多維數組庫/類的建議。 我真正需要的是:

  • 動態分配具有在運行時確定的大小的數組的能力

  • 訪問和修改單個數組值的能力(快速)

  • 能夠使用簡單的數組算術,例如array1 = array2 + 2 * array3

  • 一個維護良好的圖書館

我遇到了各種圖書館,包括:

  • Blitz++ ,看起來正是我需要的,但似乎維護得不是很好(最新的穩定版本是 5 年前)

  • Boost ,它不支持數組算術,與 Blitz++ 相比似乎相當慢。

  • Jonn Bowman 的array.h沒有文檔。

是否有人對上述選項有任何其他建議或意見?

Eigen維護得非常好(至少現在每個月都會推出新版本)並支持您需要的其他操作。

這里有一個廣泛且相對較新的調查,包括基准。

我相信您可以通過將 Boost.UBlas 綁定到 LAPACK 或 Intel MKL 等基礎數值庫來加速它,但還沒有這樣做。

fwiw,似乎最常作為候選者出現的實現是 Boost.UBlas 和 MTL。 根據我的經驗,廣泛采用更有可能促進持續的支持和發展。

Necomi似乎提供了您想要的功能。

它包括對任意多維數的支持,其維度可以在運行時固定,提供對單個元素的快速訪問,同時還支持算術(以及其他)表達式。

  • uBlas ,Boost 的一部分。 它提供完整的 BLAS 1-3 級,因此提供了許多數組算術函數。
  • Armadillo似乎也是一個 C++ 線性代數庫,據我所知,它可以選擇性地使用 LAPACK/Atlas(這當然使它非常快速)。
  • GNU 科學圖書館提供完整的 BLAS。 我不知道它有多快,或者它是否可以使用 LAPACK/Atlas。
  • 如果你不需要比你列出的更花哨的東西,你可以很容易地自己包裝例如 Atlas 的 BLAS。 但是,如果您不必這樣做,您可能不想重新發明輪子。

又是一個無恥的自吹自擂,

https://github.com/dwwork/FortCpp/

我已經在 GitHub 上發布了我自己對這個問題的個人解決方案。 無論如何,我都不是 C++ 專家,但我想我至少會把它扔在那里。

也許你想試試我的“Multi”庫: https ://gitlab.com/correaa/boost-multi

  • 動態分配具有在運行時確定的大小的數組的能力
    multi::array<int, 2> A({m, n});
  • 訪問和修改單個數組值的能力(快速)
    A[i][j] += 42;

生成類似於A.base() + i*stride_1 + j*stride_2的機器代碼。 https://gitlab.com/correaa/boost-multi#whats-up-with-the-multiple-bracket-notation

  • 能夠使用簡單的數組算術,例如array1 = array2 + 2 * array3

好吧,不是那樣,我決定將數組算術與數據結構分開。

話雖如此,該庫與 STL 算法非常兼容(如果您的步伐允許,它有一個使用 BLAS 的適配器)。

過度簡化有關訪問模式的一些問題,...

template<class T, class X, class Y>
auto axpy(T alpha, X const& x, Y&& y) -> Y&& {
    assert( extensions(x) == extensions(y) );
    std::transform(
        x.elements().begin(), x.elements().end(),
        y.elements().begin(), 
        y.elements().begin(),
        [&](auto const& ex, auto& ey) {return alpha*x + ey;}
    );
    return std::forward<Y>(y);
}
...

auto array1 = axpy(2, array2, +array3);  // array1 = 2*array2 + array3;  // unary + will make a modifiable copy before it starts.
  • 一個維護良好的圖書館

我會盡可能地維護它,我也歡迎貢獻者。

從性能的角度來看,我嘗試過 boost::MultiArray 和 Armadillo。 兩者都不是很快,因為與數組或向量相比,它們的訪問時間都很慢,而且我能夠在諸如 x1(4:10) = x2(1:6) + x2(2:7) 之類的操作中擊敗這些包+ x2(3:8) 通過使用一個簡單的手動編碼循環(我確信在我的編譯器優化的幫助下)。 當您進入矩陣乘法時,這些包可能會通過 LAPACK 和 BLAS 提供一些好處,但您始終可以自己使用這些接口。

需要注意的是,這是無恥的自我推銷,

https://github.com/ndarray/ndarray

可能值得研究。

雖然它沒有提供優化的數學運算符,但它確實為此提供了 Eigen 接口。 它真正突出的地方在於通過 SWIG 或 Boost.Python 提供與 Python/NumPy 的互操作性。

也許像 BLAS 這樣的庫,一個 CBLAS 存在,但不記得在哪里。

http://www.netlib.org/blas/

暫無
暫無

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

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