C++ 什么是使向量c+的向量的每个元素平方的最省时的方法+;

C++ 什么是使向量c+的向量的每个元素平方的最省时的方法+;,c++,C++,我目前有一个浮点型向量向量,其中包含一些数据: vector<vector<float> > v1; vector<vector<float> > v2; 向量v1; 矢量v2; 我想知道什么是将v1中的每个元素平方并存储在v2中的最快方法?目前,我只是访问v1的每个元素,将其自身相乘,并将其存储在v2中。如下所示: for(int i = 0; i < 10; i++){ for(int j = 0; j < 10

我目前有一个浮点型向量向量,其中包含一些数据:

 vector<vector<float> > v1;
 vector<vector<float> > v2;
向量v1;
矢量v2;
我想知道什么是将v1中的每个元素平方并存储在v2中的最快方法?目前,我只是访问v1的每个元素,将其自身相乘,并将其存储在v2中。如下所示:

 for(int i = 0; i < 10; i++){
     for(int j = 0; j < 10; j++){
        v2[i][j] = v1[i][j]*v[i][j];
     }
  }
for(int i=0;i<10;i++){
对于(int j=0;j<10;j++){
v2[i][j]=v1[i][j]*v[i][j];
}
}

幸运的是,您正在使用的编译器能够理解您想要做的事情,并对其进行转换,因此它使用cpu的sse指令并行执行平方运算。在这种情况下,代码接近最佳速度(在单核上)。您还可以尝试egen库(),它提供了一些更可靠的方法来实现高性能。你会得到这样的结果

ArrayXXf v1 = ArrayXXf::Random(10, 10);
ArrayXXf v2 = v1.square();

这也让您的意图更加明确。

如果您想留在CPU世界,OpenMP应该可以轻松地帮助您。单个
#pragma omp parallel for
将在可用内核之间分配负载,您可以通过告诉编译器使用
ivdep
simd
pragmas进行向量化来获得进一步的收益


如果GPU是一个选项,那么这是一个非常适合OpenCL的矩阵计算。谷歌为OpenCL矩阵乘法的例子。基本上,您可以有2000个线程执行单个操作,或者更少的线程在向量块上操作,内核编写起来非常简单。

删除
v1
的内容是否可以接受?并行性,例如,对每个(内部)使用
std::async
vector.yes如果您选择并行路径,可以删除v1OpenMP和OpenCL的内容。取决于向量的长度和计算的次数。在本例中,我使用了10×10向量数组的任意数。但在我的应用程序中,max的矢量数组将是2000 x 2000矢量数组。谢谢,我一定会查看OpenMP和OpenCL。我不确定“完美的OpenCL”。计算量很小,循环可能是内存受限的。计算量取决于向量的大小。如果它们不够大,OpenCL的开销将大于性能。