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