【问题标题】:openmp reduce techniqueopenmp减少技术
【发布时间】:2012-04-13 13:17:01
【问题描述】:

我有这个用于查找最小和最大长度的 for 循环,如您所见,我在这里有两个值要减少,而在查看 OpenMP 时,我只能注意到它只为一个值提供了减少技术。

for (size_t i = 0; i < m_patterns.size(); ++i) 
{// start for loop
    if (m_patterns[i].size() < m_lmin)          
        m_lmin = m_patterns[i].size();          
    else if (m_patterns[i].size() > m_lmax)           
        m_lmax = m_patterns[i].size();
 }// end for loop 

我可以做以下吗

 #pragma omp parallel for reduction (min:m_lmin,max:m_lmax)

或者我应该将 for 循环重写为两个 for 循环,一个用于最小值,一个用于最大值

另一个问题.. 我可以在 OpenMP 中使用像 concurrent_vector 这样的 tbb 容器

【问题讨论】:

标签: c++ parallel-processing openmp reduce tbb


【解决方案1】:

从 OpenMP 3.1 开始,他们开始支持最小和最大缩减操作。 GCC 4.7 提供 OpenMP 3.1。你可以参考this link 了解更多关于最小最大减少的细节。

【讨论】:

    【解决方案2】:

    您可以滚动您自己的并发向量以及最小和最大减少,方法是并行填充变量的私有版本,然后将它们合并到关键部分。这将适用于仅支持 OpenMP 2.5(不支持最小和最大缩减)的 MSVC。但无论您的 OpenMP 版本是否支持最小和最大缩减,这都是一种有用的学习技术。

    只要您循环的项目数远大于线程数(或者与合并相比,遍历项目的时间较长),此方法就很有效。

    #pragma parallel 
    {
        int m_lmin_private = m_lmin;
        int m_max_private = m_max_private;
        #pragma omp for nowait
        for (size_t i = 0; i < m_patterns.size(); ++i) {
            if (m_patterns[i].size() < m_lmin_private)          
                m_lmin_private = m_patterns[i].size();          
            else if (m_patterns[i].size() > m_lmax_private)           
                m_lmax_private = m_patterns[i].size();
        }
        #pragma omp critical
        {
            if (m_lmin_private<m_lmin)          
                m_lmin = m_lmin_private;    
            if (m_lmax_private>m_lmax)           
                m_lmax = m_lmax_private;                     
        }
    }
    

    对于并发向量,我们使用相同的方法:

    std::vector<int> vec;
    #pragma omp parallel
    {
        std::vector<int> vec_private;
        #pragma omp for nowait //fill vec_private in parallel
        for(int i=0; i<n; i++) {
            vec_private.push_back(i);
        }
        #pragma omp critical
        vec.insert(vec.end(), vec_private.begin(), vec_private.end());
    }
    

    【讨论】:

      【解决方案3】:

      就 openmp 而言 - 提供了官方规范 (www.openmp.org)。但最后你的编译器完成了所有的工作。所以你的问题的答案可能与编译器有关...... 然而微软提供http://msdn.microsoft.com/de-de/library/2etkydkz(v=vs.80).aspx

      建议

      #pragma omp parallel for reduction(min:m_lmin) reduction(max:m_lmax)
      

      【讨论】:

      猜你喜欢
      • 2016-06-12
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多