我有一个复杂的问题,我正在考虑使用OpenMP,但我不确定它是否会按要求运行。
基本上我在我的问题外部和内部部分有两层并行性,内部部分是OpenMP的理想选择,实际上与传统线程相比,OpenMP过于复杂,需要手动平衡。外部部分哪里更适合传统的线程,我不确定OpenMP是否合适。最终,我需要使用OpenMP正确运行应用程序,或者使用单个线程运行OpenMP。
外部问题是一组几个任务,主要是A和B,次要的是C和D
内部问题是A和B中的项目循环,具有可变的计算成本,其中A是高优先级但B是低优先级。
基本结构是
任务A:
while True:
pull current StateB
update StateA based on StateB
push StateA
任务B:
while True:
pull current StateA
update StateB based on StateA
push StateB
任务C和D:
while True:
wait for new StateA
pull StateA
update LocalState based on StateA
export LocalState
注意单线程的顺序应为
while True:
update StateA based on StateB
update LocalState based on StateA
export LocalState
update StateB based on StateA
所以C和D将在A推动其状态,然后等待新状态后执行,并且应该比A更快。 虽然A和B都尽可能快地检查另一个的新状态,并在它存在时获取它然后更新它们自己的状态并推动该状态以使另一个变化可用,关键是它们都不应等待新的从另一个国家来说,而不是在他们的国家中使用旧国家。
现在我理解的OpenMP的问题是,如果少于4个线程,每个任务都有一个内部循环并继续运行直到停止,然后任务通过交换数据进行交互。我对OpenMP剂量任务的理解是,如果有一个单独的线程,它将按顺序执行它们,如果编译器不支持OpenMP
注意我正在使用C ++,
所以我真正的问题是我能否只使用OpenMP才能使用它,我知道我可以使用本机线程或本机线程的包装而没有问题,但是我想在{{1}的循环中使用OpenMP和Update StateA
我喜欢OpenMP,因为它使得线程负载平衡变得更容易。但是我想在外部使用相同的系统而不是混合使用OpenMP和本机线程。
我怀疑我正在寻找的东西是不可能的,但我希望这里有人知道如何管理这个。