c++ 对象的Openmp并行化向量

qfe3c7zg  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个对象向量,每个对象都是机器学习代理类的示例。对于这个任务的目的,唯一重要的是这个类的每个示例都必须运行一个复杂的、代价高昂的run()函数,该函数对存储在该对象中的各种数据结构执行许多不同的操作。它还使用了一对在类外部定义的变量,但如果需要的话可以修复-当运行run()时,对象不需要相互交互或与全局变量交互。现在,这个向量中的代理数量非常小,通常等于CPU核心的数量。
我已经运行了一个测试,它只提供了一个~2.6的速度提升与8个线程的8核处理器,不理想。该功能仅限于每个循环使用~ 17 ms。简化后,它看起来像这样:

vector <MLAgent> agent;
float learning_speed = .01;
size = agent.size();
#pragma omp parallel for num_threads(num_CPU * (size > num_CPU) + size * (size <= num_CPU))
for (int i = 0; i < size; i++)
agent[i].run(learning_speed);

字符串
如何改善这种情况?以不同的方式存储代理会有帮助吗?run函数不使用任何全局变量是否重要?并行化run()的部分基本上不是一个选择-它太复杂和集成了。

vawmfj5a

vawmfj5a1#

1.不要指定线程数:将其留给环境变量。
1.除非迭代所用的时间完全相同,否则使用schedule(dynamic,1),它允许操作系统将任何任务分配给任何核心。
1.编写地道的C++:for ( auto& a : agent ) a.run()的值。

相关问题