我正尝试在我的项目中使用 OpenMP,该项目在模拟中包含 N 个代理。每个代理都有一个位置 vector 。在我的程序中,我执行以下操作:
for(int i=0;i<agents.size();i++){
for(int j=0;j<agents.size();j++){
if(i==j) continue;
if(distance_between(i,j)<10){
//do a lot of calculations for interaction between i and j,
//and a bunch of changes to variables of the Agents stored in the list
}
}
}
我是否可以简单地在第一个循环前面添加“#pragma omp parallel for”来分配工作?如果我这样做,我的程序运行得更快,但我担心它所做的计算可能不准确。
这些计算的顺序无关紧要,只要处理每个 i,j 对,并且最内层循环内定义的变量之外没有变量,并且我的 Agents 类中的变量永远改变(只读) .
我不是系统专家,因此很难理解 OpenMP 的内部工作原理,并且对它有点怀疑。感谢您对此的任何帮助!
最佳答案
是的,添加 pragma 是正确的。内存被认为由所有线程隐式共享。但这并不意味着它会工作得更快。有多个问题需要考虑:
- 您的系统有多少个处理器?
- 你使用整数还是 float ?对于整数,顺序无关紧要,但对于 float 则不然
- 哪些变量只能被最内层的循环访问?您可以将它们声明为私有(private)以获得更好的性能。
关于c++ - 用于嵌套 for 循环的 OpenMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543837/