对矢量c ++矢量的每个元素进行平方的最有效方法是什么

时间:2015-06-28 13:38:00

标签: c++

我目前有一个float类型向量的向量,它包含一些数据:

 vector<vector<float> > v1;
 vector<vector<float> > 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];
     }
  }

2 个答案:

答案 0 :(得分:1)

运气好的话,你正在使用的编译器理解你想要做的事情并转换它,所以它使用cpu的sse-instruction来并行处理你的平方。在这种情况下,您的代码接近最佳速度(在单核上)。您还可以尝试使用特征库(http://eigen.tuxfamily.org/),它可以提供一些更可靠的方法来实现高性能。然后你会得到像

这样的东西
ArrayXXf v1 = ArrayXXf::Random(10, 10);
ArrayXXf v2 = v1.square();

这也使你的意图更加明确。

答案 1 :(得分:1)

如果您希望保持CPU世界,OpenMP应该可以轻松帮助您。单个#pragma omp parallel for将在可用内核之间划分负载,您可以通过告诉编译器使用ivdepsimd pragma进行矢量化来获得进一步的收益。

如果GPU是一个选项,这是一个矩阵计算,非常适合OpenCL。 Google for OpenCL矩阵乘法示例。基本上,你可以让2000个线程执行单个操作,或者更少的线程在向量块上运行,内核编写起来非常简单。