我正在尝试为我的C++/OpenMP程序使用任务结构:
#pragma omp parallel
{
typename ClusterNormal<DIM>::VectorMean ResultMeanThread;
ResultMeanThread.setZero();
#pragma omp single
for(list<unsigned int>::const_iterator it=IDLeft.cbegin(); it!=IDLeft.cend(); it++)
{
#pragma omp task
{
ResultMeanThread += Data[*it];
}
}
}
这段代码计算了一些
VectorMean
(不考虑它们是什么,但它们定义了+运算符)在IDLeft所示的数据元素上的总和。每个线程都用全零初始化
VectorMean
。我的问题是,在for循环之后,ResultMeanThread
仍然由全零组成。当一个任务被执行时,总和被正确计算,但在任务执行后,
ResultMeanThread
总是重新初始化为零。我该怎么修复它?我正在使用任务因为有列表,但我的代码不起作用。
ResultMeanThread
应该在并行区域之前声明,并标记为共享变量,这样才合适。另外,将+=
操作应用于VectorMean
类型的对象,在并行环境下是否安全? - Piotr SkotnickiResultMeanThread
。我认为在共享变量上使用+=运算符不是一个好主意,因为会存在竞争条件... - DarkoResultmeanThread
的总和计算出来。 - DarkoResultMeanThread
视为私有,就像您在第一条评论中发布的那样。 - Darko