openmp减少的结果很奇怪 [英] Weird results with openmp reduction

查看:112
本文介绍了openmp减少的结果很奇怪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

参加此类课程:

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]);值正确(以下打印内容也正确).

D d = distance->compute(query, values[i]); value is correct (and the following print too).

但是,由于某些奇怪的原因,每次计算parallel for时,min.val就是0(换句话说,最后一个cout总是打印min.val=0).

However, for some weird reason, everytime that the parallel for is computed, min.val is 0 (in few words the last cout prints always min.val=0).

显然,这不是全部代码,我使它尽可能简单.

Obviously this is not the whole code and I made it as simple as possible.

推荐答案

您缺少用于用户声明的减少内容的初始化代码:

You are missing the initalizer for user declared reduction:

#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})

或者,您可以添加成员初始化:

Alternatively, you can add a member initialization:

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

这是更通用的方法,即使没有-fopenmp,也可以确保程序正常运行.

This is more general and will make sure the program works correctly even without -fopenmp.

这篇关于openmp减少的结果很奇怪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆