我目前有一个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];
}
}
答案 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
将在可用内核之间划分负载,您可以通过告诉编译器使用ivdep
和simd
pragma进行矢量化来获得进一步的收益。
如果GPU是一个选项,这是一个矩阵计算,非常适合OpenCL。 Google for OpenCL矩阵乘法示例。基本上,你可以让2000个线程执行单个操作,或者更少的线程在向量块上运行,内核编写起来非常简单。