gpt4 book ai didi

c++ - 将 openMP 与 SETS 结合使用

转载 作者:行者123 更新时间:2023-11-28 03:34:29 25 4
gpt4 key购买 nike

我想在 OpenMP 的帮助下并行化这段代码,比如#pragma omp parallel for 在不同线程之间分配工作。

什么是有效的方法?这里的级别在各种线程之间共享。

这里make是一个集合。

for(iter=make.at(level).begin();iter!=make.at(level).end();iter++)
{
Function(*iter);
}

最佳答案

如果 make.at(level) 返回的类型具有具有恒定访问时间的随机访问迭代器,并且如果您的编译器支持足够新的 OpenMP 版本(阅读:它不是 MSVC++) 那么你可以直接使用 parallel for 工作共享指令:

obj = make.at(level);
#pragma omp parallel for
for (iter = obj.begin(); iter != obj.end(); iter++)
{
Function(*iter);
}

如果该类型不提供随机访问迭代器,但您的编译器仍然支持 OpenMP 3.0 或更新版本,那么您可以使用 OpenMP 任务:

#pragma omp parallel
{
#pragma omp single
{
obj = make.at(level);
for (iter = obj.begin(); iter != obj.end(); iter++)
{
#pragma omp task
Function(*iter);
}
}
}

此处单个线程执行 for 循环并创建多个 OpenMP 任务。每个任务将使用 *iter 的相应值对 Function() 进行一次调用。然后每个空闲线程将开始从未完成的任务列表中挑选。在并行区域的末尾有一个隐式屏障,因此主线程将尽职地等待所有任务完成,然后再继续执行越过并行区域。

如果您不幸使用 MS Visual C++,那么您别无选择,只能创建一个对象指针数组并使用简单的整数循环对其进行迭代:

obj = make.at(level);
obj_type* elements = new obj_type*[obj.size()];
for (i = 0, iter = obj.begin(); i < obj.size(); i++)
{
elements[i] = &(*iter++);
}

#pragma omp parallel for
for (i = 0; i < obj.size(); i++)
{
Function(*elements[i]);
}

delete [] elements;

这不是最优雅的解决方案,但应该可行。

编辑:如果我从你的问题标题中理解正确,那么你正在使用集合。这排除了第一种算法,因为集合不支持随机访问迭代器。根据您的编译器对 OpenMP 任务的支持,使用第二种或第三种算法。

关于c++ - 将 openMP 与 SETS 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11445511/

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