[英]C++ OpenMP parallel for loop with synchronization?
这是我第一次使用 OpenMP,我对并行编程有初步的了解。
我想知道的是如何进行按时间同步的 OpenMP 并行模拟?
在这个模拟中,代理将是多线程的,它们将执行一些每个循环可能相互依赖的任务。
以下是我正在考虑的(未完成的)POC代码:
void simulateNext(Agent agent, int time) {
// do simulation stuff
}
int main() {
// TODO add initialise code for all agents
int max_time = 10000;
int num_agents = 1000
for (int i = 0; i < max_time; i++) {
#pragma omp parallel for
for (int j=0; j < num_agents; j++) {
simulateNext(agents[j], i);
}
}
}
我非常确定这会起作用,但是并行 for 似乎并不是最好的方法,我猜上面的实现意味着对于 i 的每次迭代? 我将产生并销毁线程。 如果确实如此,那似乎是一种浪费。
有更好的方法吗? 我在想下面的代码可能会更好,但我不确定它是否有效。
int max_time = 10000;
void runSimulation(Agent agent) {
for (int i = 0; i < max_time; i++) {
// do simulation stuff
#pragma omp barrier
}
}
int main() {
// TODO add initialise code for all agents
int num_agents = 1000
#pragma omp parallel for
for (int j=0; j < num_agents; j++) {
runSimulation(agents[j]);
}
}
写这个的简单方法是这样的
int main() {
// TODO add initialise code for all agents
int max_time = 10000;
int num_agents = 1000
#pragma omp parallel
{
for (int i = 0; i < max_time; i++) {
#pragma omp for
for (int j=0; j < num_agents; j++) {
simulateNext(agents[j], i);
}
}
}
}
在omp for
的末尾已经有一个隐含的屏障,让每个线程执行外部循环是完全合理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.