迭代器openMP的循环
loop for iterator openMP
我使用OpenMP来并行化我的代码。我尝试用两个迭代器并行化的循环。我想知道我的实现是否是并行化这个顺序代码的最佳方式:
#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
int main(int argc, char *argv[])
{
vector<float> v = {1, 2, 3, 4};
vector<float> d = {0, 0, 0, 0};
vector<float>::iterator iterV, iterD;
for(iterV = v.begin(), iterD = d.begin(); iterV < v.end(); ++iterV, ++iterD)
{
*iterD = *iterV;
}
for(iterD = d.begin(); iterD < d.end(); ++iterD)
cout << *iterD << endl;
return 0;
}
我的这个代码的并行版本:
#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
int main(int argc, char *argv[])
{
vector<float> v = {1, 2, 3, 4};
vector<float> d = {0, 0, 0, 0};
vector<float>::iterator iterV, iterD;
iterV = v.begin();
iterD = d.begin();
#pragma omp parallel for
for(int i = 0; i < v.size(); ++i)
{
*(iterD + i) = *(iterV + i) ;
}
for(iterD = d.begin(); iterD < d.end(); ++iterD)
cout << *iterD << endl;
return 0;
}`
您的示例非常简单,几乎不需要任何性能优化。您只需复制内存(可以使用std::copy
进行优化)。
您编写的代码是正确的,几乎没有其他方法可以通过编写代码来获得性能。但是,为了维护更干净的代码,我尝试维护每个线程专用的循环迭代器。这使代码变得干净(个人偏好)。
vector<float> v = {1, 2, 3, 4};
vector<float> d = {0, 0, 0, 0};
#pragma omp parallel for
for(auto it_v = v.begin(),it_d = d.begin(); it_v!=v.end();++it_v,++it_d)
{
*it_d = *it_v;
}
编辑
在这种情况下,OpenMP 3.1不允许多循环初始化。它不符合他们的规格。因此,一种方法如下:
#pragma omp parallel
{
auto it_v = v.begin(),it_d = d.begin();
#pragma openmp for
for(; it_v!=v.end();++it_v)
{
*it_d = *it_v;
}
}
相关文章:
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP使这个循环并行
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用输入打破 OpenMP 中的循环
- OpenMP for 循环并行性问题
- OpenMP:for 循环避免数据竞争,而无需使用关键
- 任务内部的 OpenMP 任务循环
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- OpenMP 内部的函数调用用于循环
- 如何使用 OpenMP 正确并行化 for 循环?
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 如何使用 OpenMP 减少嵌套循环?
- 具有动态数组分配的OpenMP嵌套循环
- OpenMP 和不平衡嵌套循环
- OpenMP 嵌套循环处理性能
- 使用与 openmp C++并行的循环计算矩阵中每一行的最小值
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- 优化依赖循环openmp