c++ - 迭代器 openMP 的循环

标签 c++ loops 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 进行优化)。

您编写的代码是正确的,几乎没有其他方法可以提高性能。但是,为了保持更清晰的代码,我尝试保持每个线程私有(private)的循环迭代器。这使代码干净(个人喜好)。

  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; 
    }
  }

关于c++ - 迭代器 openMP 的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053262/

相关文章:

python - 如何以更优雅的 Pythonic 方式组织此循环

c++ - 贪心算法练习无法正常工作

r - 绘制两种正态分布混合的密度曲线

java - 为什么外循环不能加条件

javascript - 动画倒计时/到特定数字

c++ - Map迭代器遍历技术

c++ - 如果我有运算符 T *(),是否需要重载 delete?

c++ - 如何让部分模板与子类一起使用

java - 一般套接字问题 - 将 C++ 结构从 Java 转移到 C++

c++ - 从 vector 中删除元素 – rbegin() 与 begin()