0

如果我有这样的循环

int main (){
....

for (i=0; i< N; i++)
{
  /*Do some calculations*/
  for (j=0; j<M; j++)
  {
    /*Do more calculations*/
    compute_x( some pointers as args );
  }
  compute_y(some pointer as args);
}
...

return value;
}

and 

void compute_x( some pointers as args )
{
  /* some calculations*/
  for (h=0; h<COUNT; h++)
  {
   ...
  }
}
}

和 compute_y() 类似。

我的问题是,如果我使用 OpenMP 指令并行化主循环中的外循环,

#pragma omp parallel for schedule (runtime) private ( ...)
for (i=0; i< N; i++)
{
 ...
}

函数的行为compute_x()compute_y()?? 据我了解,它们将由每个线程执行,因此 for 循环compute_x()将由每个线程从 0 执行到 COUNT 。

如果这是正确的,我还能做些什么来在函数的 for 循环中分担工作负载compute_x()(假设没有数据依赖性)。我的第一个猜测是让函数 compute_x() 和 compute_y() 内联,但函数相当大,而且它们还调用其他函数,幸运的是,它们也可以并行执行。

4

2 回答 2

2

如果外循环有足够的迭代来保持所有内核忙碌,则没有理由将并行化扩展到内循环。这只会创建更多不必要的线程。

于 2012-04-12T17:03:48.070 回答
1

如果您some pointers as args对每个线程都不同(每个线程不同i)或者如果它们带有const修饰符,即没有线程可以通过指针修改内容,那么不会发生任何意外。

坏事是当您的不同线程共享相同的指针并同时写入/读取它们指向的数据时,您可能会得到意想不到的结果。

于 2012-04-12T16:16:36.377 回答