c++ - 用于嵌套 for 循环的 OpenMP?

标签 c++ simulation openmp parallel-processing

我正尝试在我的项目中使用 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/

相关文章:

c - C中的for循环优化

我们可以并行化这个任务吗?

python - 无法为 prange 中的数组赋值

C++ 空值和 this 指针

Python点击网页上的按钮(后端)

sql - 如何在 SQLite 中模拟 REPEAT()

android - 如何在真实设备上模拟来电?

c++ - 在保留原始顺序的同时删除/删除多个 std::vector 元素的最有效方法?

c++ - 错误无效使用 void 表达式。试图将参数传递给函数

c++ - 使用三元运算符并删除移动/复制构造函数时,Visual Studio 不执行 RVO