C ++中的元素操作

时间:2013-12-08 18:49:06

标签: c++ arrays vector fortran gpu

是否有一个预先存在的库可以让我创建具有以下属性的类似数组的对象:

  1. 运行时间大小规范(在即时选择,之后不增长或缩小)
  2. 重载操作符以执行元素操作(即c=a+b将导致所有c的{​​{1}}向量c[i]=a[i]+b[i]i类似, *-等)
  3. 以元素为单位的一组优秀函数,例如/将具有元素x=sqrt(vec)
  4. 提供“汇总”功能,例如x[i]=sqrt(vec[i])sum(vec)
  5. (可选)可以将操作发送到GPU进行处理。
  6. 基本上类似于数组在Fortran中的工作方式,隐藏了所有实现。目前我正在使用STL中的mean(vec)并手动重载运算符,但我觉得这可能是一个已经解决的问题。

3 个答案:

答案 0 :(得分:17)

在标准图书馆的尘土飞扬的角落里,很久以前就被大家所遗忘,坐在一个名为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

答案 1 :(得分:3)

您可以使用Cilk Plus Extentions(https://www.cilkplus.org/)通过将元素操作应用于C / C ++相同形状的数组来提供数组表示法。它探讨了处理器和协处理器的矢量并行性。

示例 标准C代码:

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

Cilk Plus - 数组符号:

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

答案 2 :(得分:2)

Thrust库是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