我正在尝试使用OpenMP实现一些设计。
我有一个具有N
个可用处理器的多核系统。我希望有一个长度为k*P
的对象的向量,由一个线程(通过读取文件)以P
批量填充,即单个线程读取此文件并写入{{1然后vecObj[0 to P-1]
等。为了简单起见,这个向量是预先调整大小的(即使用vecObj[p to 2P-1]
运算符插入,没有后推,就我们而言是恒定长度。)
将批处理写入向量后,我希望剩余的=
个线程处理可用数据。由于每个对象可能需要不同的时间来处理,因此对剩余的线程进行动态调度会很好。当所有线程正在处理数据时,下面的代码段工作得非常好。
N-1
现在,根据我的说法,我在思考解决方案时面临的主要问题是如何在可用数据范围内动态调度#pragma omp parallel for schedule(dynamic, per_thread)
for(size_t i = 0; i < dataLength(); ++i) {
threadWorkOnElement(vecObj, i);
}
线程,而另一个线程只是继续阅读并用数据填充向量?
我猜测使用std atomic可以实现编写新数据和消息传递剩余线程的问题。
我认为我想要实现的是下面的伪代码
N-1
这是实现我想要做的正确方法吗?我该如何处理这种嵌套并行性?不是那么重要:我宁愿坚持使用openmp指令而不使用std原子,这可能吗?怎么样?