将openMP与SETS结合使用
Using openMP with SETS
我想在OpenMP的帮助下用类似的东西并行化这段代码CCD_ 1以在不同线程之间划分工作。
什么是有效的方法?这里的级别在各种线程之间共享。
这是一套。
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()
进行单个调用。然后,每个空闲线程将开始从未完成任务列表中进行挑选。在并行区域的末尾有一个隐含的屏障,因此主线程将尽职尽责地等待所有任务完成,然后继续执行通过并行区域。
如果您不幸使用MSVisualC++,那么除了创建一个对象指针数组并使用一个简单的整数循环对其进行迭代之外,您别无选择:
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任务的支持,使用第二种或第三种算法。
似乎并行for中的变量必须是带符号的int。但我不确定。这里有一个关于这个的话题。为什么循环变量必须在的并行中签名?
要在OpenMP中使用这种迭代器模式,可能需要重新思考如何执行循环——您不能使用#pragma omp for
,因为您的循环不是一个简单的整数循环。我想知道以下是否可行:
iter = make.at(level).begin();
end = make.at(level).end();
#pragma omp parallel private(iter) shared(make,level,end)
{
#pragma omp single
func(iter); /* only one thread does the first item */
while (1)
{
#pragma omp critical
iter = make.at(level).next(); /* each thread gets a different item */
if (iter == end)
break;
func(iter);
}
} /* end parallel block */
请注意,我必须在关键部分将您的iter++
更改为next()
调用才能使其工作。原因是共享的make.at(level)
对象需要记住哪些项目已经被处理。
- 多态性和功能结合
- 将 Vulkan 与 SFML 结合使用?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- 如何将增强MSM与增强信号结合使用?
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- C++ 将函数指针与最佳性能相结合
- 将 Lua 与 C++ DLL 结合使用
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 将2个欧拉角与GLM相结合的问题
- 结合std::execution和OpenMP是否可取
- 抽象和派生与std::list相结合
- 想要将 CGAL 与四元数相结合是否合乎逻辑
- 存储/传递 v8 承诺解析器供以后使用的最佳实践?(结合C++线程)
- 如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用
- 可变参数模板与默认模板参数相结合
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 将openMP与SETS结合使用