簡體   English   中英

openmp減少的結果很奇怪

[英]Weird results with openmp reduction

在有這個班:

template <typename C, typename R, typename D>
class myClass{
    public:
    R Query(const C &query);
    ...
    private:
    struct Compare{
        D val;
        size_t index;
    };
    #pragma omp declare reduction(minimum : Compare : omp_out = omp_in.val < omp_out.val ? omp_in : omp_out)
    std::vector<C> values;
    ...
}


template <typename C, typename R, typename D>
R Cache<C,R,D>::Query(const C &query){
    Compare min;
    R result;
    if(!values.empty()){
            #pragma omp parallel for reduction(minimum:min)
            for(size_t i=1; i<values.size(); i++){
                D d = distance->compute(query, values[i]);
                std::cout<<" distance("<<query<<" "<<values[i].code<<")= "<<d;
                if(d < min.val){
                    std::cout<<" NEW MIN!";
                    min.val = d;
                    min.index = i;
                }
                std::cout<<std::endl;
            }
        std::cout<<"min.val="<<min.val<<std::endl;
   }
...

D d = distance->compute(query, values[i]); 值正確(以下打印也正確)。

但是,出於某些奇怪的原因,每次計算parallel forparallel for度時, min.val均為0 (換句話說,最后一個cout始終打印min.val=0 )。

顯然,這並不是全部代碼,我使它盡可能簡單。

您缺少用於用戶聲明的減少的初始化代碼:

#pragma omp declare reduction(minimum : Compare : omp_out = omp_in.val < omp_out.val ? omp_in : omp_out) \
                initializer (omp_priv=Compare{std::numeric_limits<D>::max(), -1})

另外,您可以添加成員初始化:

template <typename D>
class Foo {
struct Compare{
    D val {std::numeric_limits<D>::max()};
    int index {-1};
};

這更加通用,即使沒有-fopenmp ,也可以確保程序正常運行。

如果您在並行塊中初始化結構,則根本不需要初始化程序

 #pragma omp declare reduction( \
    minimum : Compare : omp_out = omp_in.val < omp_out.val ? omp_in : omp_out\
    ) 

#pragma omp parallel reduction(minimum:min)
{
    D d = distance->compute(query, values[0]);
    min = Compare{d,0}
    #pragma omp for
    for(size_t i=1; i<values.size(); i++){
        d = distance->compute(query, values[i]);
        if(d < min.val)
            min = Compare{d,i};
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM