OpenMP线程计数问题

2 c++ multithreading openmp

所以我为我的操作系统类做了一些梯形规则的并行编程,这是一个功课问题,但我不是在寻找源代码.

经过一些研究后,我决定使用每个线程来计算子区间.使用:

 g = (b-a)/n;
   integral += (func(a) + func(b))/2.0;

#  pragma omp parallel for schedule(static) default(none) \
      shared(a, h, n) private(i, x) \
      reduction(+: integral) num_threads(thread_count)
   for (i = 1; i <= n-1; i++) {
      x = a + i*g;
      integral += func(x);
   }
Run Code Online (Sandbox Code Playgroud)

在我的积分函数中,func(x)是我从文件中读入的函数.

所以我给我的教授发电子邮件,询问他是如何选择线程数的.(因为它们需要被N整除(对于梯形法则)

但他说我不需要定义它们,它会根据我机器上的核心数量来定义它们......所以不用说我有点困惑.

cas*_*nca 8

您的教授是正确的:默认情况下,OpenMP将选择最佳线程数,通常是核心数.

您不必担心N可以完全整除的线程数:OpenMP会自动在线程之间分配迭代,如果它们不能被完全整除,一个线程最终会执行一点或多或少的工作.

  • @Mercfh:不,但这可能是个好主意,因为在这种情况下您必须明确声明共享。C++ 和 Fortran 的初始默认共享不同,因此明确有助于移植。 (2认同)