2013-12-08 20 views
3

是否有預先存在的庫,將讓我創建具有以下性質陣列狀物體:元爲單位的運算

  1. 運行時間大小規格(選擇在instantition,不生長或收縮之後)
  2. 算重載執行元素方式操作(即c=a+b將導致矢量cc[i]=a[i]+b[i]所有i,同樣爲*-/等)
  3. 甲克OOD集的哪個的elementwise起作用的功能,例如x=sqrt(vec)將具有元件x[i]=sqrt(vec[i])
  4. 提供「總結」的功能,例如sum(vec)mean(vec)
  5. (可選)的操作可以被髮送到用於處理的GPU。

基本上就像在Fortran中工作的方式一樣,隱藏所有的實現。目前我正在使用STL中的vector並手動重載操作符,但我覺得這可能是一個解決的問題。

+0

也許你可以試試[艾根(http://eigen.tuxfamily.org/)庫。 – kevin

回答

14

在標準庫的塵土飛揚的角落裏,每個人都被人遺忘,坐在一個名爲valarray的班級裏。看看它,看看它是否適合你的需求。

manual page at cppreference.com

std::valarray是用於表示和操縱值數組的類。它支持基於元素的數學運算和各種形式的廣義下標運算符,切片和間接訪問。

出於說明的代碼段:

#include <valarray> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 

int main() 
{ 
    std::valarray<int> a { 1, 2, 3, 4, 5}; 
    std::valarray<int> b = a; 
    std::valarray<int> c = a + b; 
    std::copy(begin(c), end(c), 
     std::ostream_iterator<int>(std::cout, " ")); 
} 

輸出:2 4 6 8 10

2

推力庫,它是在CUDA工具包的一部分,提供了一種用於在GPU上的向量操作的STL狀界面。它還具有OpenMP後端,但GPU支持使用CUDA,因此您僅限於NVIDIA GPU。你必須做你自己的包裝(用表達式模板說了),如果你想擁有像載體

C = A + B的工作表現

https://code.google.com/p/thrust/

的VienaCL庫需要更多高層次的方法,提供矢量和你想要的矩陣運算。它同時擁有CUDA和OpenCL後端,因此您可以使用來自不同供應商的GPU(和多核CPU)。

http://viennacl.sourceforge.net/

的vexcl庫也看起來非常有前途(再次用兩個OpenCL和CUDA支持)

https://github.com/ddemidov/vexcl

3

您可以使用Cilk的另外一些推廣(https://www.cilkplus.org/),通過應用提供排列標記對C/C++相同形狀的數組進行元素操作。它探討了處理器以及協處理器的矢量並行性。

實施例: 標準的C代碼:

for (i=0; i<MAX; i++) 
    c[i]=a[i]+b[i]; 

Cilk的加 - 陣列的符號:

c[i:MAX]=a[i:MAX]+b[i:MAX]; 

跨越部分等:

float d[10] = {0,1,2,3,4,5,6,7,8,9}; 
float x[3]; 
x[:] = d[0:3:2]; //x contains 0,2,4 values 

您可以在陣列中使用的部分減:

_sec_reduce_add(a[0:n]); 

興趣閱讀: http://software.intel.com/en-us/articles/getting-started-with-intel-cilk-plus-array-notations