gpt4 book ai didi

c++ - OpenMP 任务和数据环境

转载 作者:太空狗 更新时间:2023-10-29 23:04:00 24 4
gpt4 key购买 nike

我正在尝试为我的 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];
}
}
}

此代码正在为 IDLeft 中指示的数据元素计算一些 VectorMean 的总和(它不介意它们是什么,但它们有运算符 + 定义)。

每个线程都用全零初始化 VectorMean。我的问题是在 for 循环之后,ResultMeanThread 仍然是全零的堆肥。

执行任务时,总和计算正确,但在任务执行后,ResultMeanThread 总是重新初始化为零。

我该如何解决?由于列表的缘故,我正在使用任务,但我的代码无法正常工作。

最佳答案

我发现问题出在 ResultMeanThread 声明为私有(private)变量。我尝试了这段代码,声明了一个 ResultMeanThread vector ,如共享变量( vector 的长度是线程数),因此每个线程只访问 vector 的一个元素(无竞争条件)。

在前面的代码中,由于 task 构造,每个 ResultMeanThread 都是零。每次执行 task 时,私有(private)变量都会被设置为它们的初始值。由于 list

,我必须使用 task 构造

代码如下:

vector<typename ClusterNormal<DIM>::VectorMean> ResultMeanThread;
typename ClusterNormal<DIM>::VectorMean ResultMeanFinal;

//here i set initial values to zero, and number of vector elements equal to total number of threads

#pragma omp parallel
{
#pragma omp single
for(list<unsigned int>::const_iterator it=IDLeft.cbegin(); it!=IDLeft.cend(); it++)
{
#pragma omp task
{
ResultMeanThread[omp_get_thread_num()] += Data[*it];
}
}
#pragma omp taskwait

// Final sum
#pragma omp critical
{
ResultMeanFinal+=ResultMeanThread[omp_get_thread_num()];
}
}

关于c++ - OpenMP 任务和数据环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930436/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com