4

OpenMP を見ていると、ここで削減する 2 つの値があることがわかるように、最小長と最大長を見つける for ループがあります。

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 ループを 2 つの for ループに書き直す必要があります。1 つは最小用、もう 1 つは最大用です。

別の質問.. OpenMPでconcurrent_vectorのようなtbbコンテナーを使用できますか

4

3 に答える 3

1

変数のプライベート バージョンを並行して入力し、それらをクリティカル セクションでマージすることにより、独自の同時実行ベクトルと最小および最大削減をロールすることができます。これは、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());
}
于 2014-03-23T20:53:52.257 に答える
0

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)
于 2012-04-13T15:49:33.007 に答える