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)
等基本上类似于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]);
兴趣阅读:
也许你可以试试图书馆。