OpenMP 线程计数问题

Posted

技术标签:

【中文标题】OpenMP 线程计数问题【英文标题】:OpenMP Thread count question 【发布时间】:2010-11-29 06:36:33 【问题描述】:

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

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

 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);
   

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

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

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

【问题讨论】:

【参考方案1】:

您的教授是对的:OpenMP 默认会选择最佳线程数,通常是内核数。

您不必担心线程数会被 N 整除:OpenMP 会自动在线程之间分配迭代,如果它们不能被整除,一个线程最终会执行更多或减少工作量。

【讨论】:

好的,如果我只取出 num_threads(线程数),我的程序应该可以工作吗?顺便说一句,甚至需要定义默认(无) @Mercfh:不,但这可能是个好主意,因为在这种情况下您必须明确声明共享。 C++ 和 Fortran 之间的初始默认共享不同,因此明确有助于移植。 @pafcu,您对默认设置说“不”对吗?我也可以取出 num_threads(thread count) 并且编译器应该正确处理它? @Mercfh:对不起,我不清楚。是的,我的意思是不需要 default(none) (但保留它以方便移植仍然是个好主意)。 casablanca 的答案是正确的,您可以将 num_threads 排除在外。哦,不是编译器而是运行时负责选择正确数量的线程。

以上是关于OpenMP 线程计数问题的主要内容,如果未能解决你的问题,请参考以下文章

openMP增量在线程之间添加int?

OpenMP - 循环中最简单的累加器给出不正确的结果

没有for循环的OpenMP不等负载

多线程计数排序

锁定线程计数

Java 线程安全计数器