C++ C+中的元素操作+;

C++ C+中的元素操作+;,c++,arrays,vector,fortran,gpu,C++,Arrays,Vector,Fortran,Gpu,是否有一个预先存在的库,可以让我创建具有以下属性的类似数组的对象: 运行时大小规格(在瞬间选择,之后不增加或缩小) 重载运算符以执行元素操作(即c=a+b将导致所有i的c[i]=a[i]+b[i]的向量c,对于*、-、//code>等也同样如此) 一组很好的函数在元素方面起作用,例如x=sqrt(vec)将包含元素x[i]=sqrt(vec[i]) 提供“汇总”功能,如sum(vec),mean(vec)等 (可选)操作可以发送到GPU进行处理 基本上类似于Fortran中数组的工作方式,所有的

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

  • 运行时大小规格(在瞬间选择,之后不增加或缩小)
  • 重载运算符以执行元素操作(即
    c=a+b
    将导致所有
    i
    c[i]=a[i]+b[i]
    的向量
    c
    ,对于
    *
    -
    //code>等也同样如此)
  • 一组很好的函数在元素方面起作用,例如
    x=sqrt(vec)
    将包含元素
    x[i]=sqrt(vec[i])
  • 提供“汇总”功能,如
    sum(vec)
    mean(vec)
  • (可选)操作可以发送到GPU进行处理

  • 基本上类似于Fortran中数组的工作方式,所有的实现都是隐藏的。目前,我正在使用STL中的
    vector
    并手动重载运算符,但我觉得这可能是一个已解决的问题。

    在标准库中尘土飞扬的角落里,有一个名为
    valarray
    的类,大家早已忘记了它。查一下,看看是否适合你的需要

    发件人:

    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, " "));
    }
    
    #包括
    #包括
    #包括
    #包括
    int main()
    {
    std::valarray a{1,2,3,4,5};
    std::VAL阵列b=a;
    std::valarray c=a+b;
    复制(开始(c),结束(c),
    std::ostream_迭代器(std::cout,“”);
    }
    

    输出:
    2 4 6 8 10

    作为CUDA工具包的一部分,推力库为GPU上的矢量操作提供了类似STL的接口。它也有一个OpenMP后端,但是GPU支持使用CUDA,因此您仅限于NVIDIA GPU。如果您想让c=a+b这样的表达式对向量起作用,您必须自己进行包装(比如使用表达式模板)

    VieCnacl库采用更高级的方法,提供您想要的向量和矩阵操作。它有CUDA和OpenCL两个后端,因此您可以使用来自不同供应商的GPU(和多核CPU)

    vexcl库看起来也很有前途(同样支持OpenCL和CUDA)


    您可以使用Cilk Plus extensions(),它通过对C/C++中相同形状的数组应用元素操作来提供数组表示法。它探索了来自处理器和协处理器的向量并行性

    示例: 标准C代码:

    for (i=0; i<MAX; i++)
       c[i]=a[i]+b[i];
    
    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]);
    
    跨步部分,如:

    for (i=0; i<MAX; i++)
       c[i]=a[i]+b[i];
    
    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]);
    
    您可以对数组部分使用缩减:

    for (i=0; i<MAX; i++)
       c[i]=a[i]+b[i];
    
    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]);
    
    兴趣阅读:

    也许你可以试试图书馆。