使用 openMP 进行多核处理与多线程

Posted

技术标签:

【中文标题】使用 openMP 进行多核处理与多线程【英文标题】:Using openMP for multicore processing vs multithreading 【发布时间】:2014-02-07 17:24:17 【问题描述】:

这个问题听起来很简单,但是我找不到任何具体的答案。所以现在说我们有一个像 corei5 680 这样的多核处理器(2 个物理内核和启用了 HT 的 4 个操作系统可用内核)。 我的问题是 openMP 在哪里完全适合图片? 1 - 当我们说使用 openMP 的多线程时,它是否会自动利用所有可用内核(在本例中为 4 个虚拟内核)并根据可用的 CPU 周期执行线程? 2 - openmp 是否可以控制如何使用物理/虚拟内核?或者它是抽象的并提供多线程环境,比如 java?

如果这听起来很基本,请原谅,但我试图在网上找到答案,但找不到任何令人满意的答案。

谢谢

【问题讨论】:

如果能在投反对票后有一些 cmets 将不胜感激! 【参考方案1】:

这取决于您正在考虑的 OpenMP 版本/功能,因为我相信以后的版本可能会为您提供更多功能,但原始库是围绕数据并行构建的 for 原语。一般来说,OpenMP 和其他数据并行编程模型会尝试抽象出底层硬件,程序员将其计算声明为对数据的一系列操作,然后由 OMP 调度。

为了回答您的第一个问题,操作系统调度程序将跨内核调度线程,OMP 调度程序将跨可用线程调度工作。

#pragma omp parallel for
for (i = 0; i < N; i++)
    a[i] = 2 * i;

OMP 调度程序将根据多种因素选择使用哪些核心(真实或 HT),包括它们的负载、分配给它的工作量以及您可能提供的任何提示。人们会期望上面的代码可以在所有可用的内核上运行(在您的示例中为 4 个)

您可以使用schedule 关键字来控制调度程序分配工作的方式。

schedule(type, chunk): 如果工作共享结构是 一个do循环或for循环。工作共享结构中的迭代 根据定义的调度方法分配给线程 本条款。三种调度方式分别是:

静态:在这里,所有 线程在执行循环之前被分配迭代 迭代。迭代在线程之间平均分配 默认。但是,为参数块指定一个整数将 将连续迭代的块数分配给特定线程。

动态:在这里,一些迭代被分配给一个较小的 线程数。一旦特定线程完成其分配 迭代,它返回以从迭代中获取另一个 左。参数 chunk 定义了连续迭代的次数 一次分配给一个线程。

引导:一大块 连续迭代被动态分配给每个线程(如 多于)。块大小随着每次连续呈指数下降 分配到参数块中指定的最小大小

来自Wikipedia

解决您的第二个问题。您还可以使用num_threads 属性来指定要使用的线程数。在示例中的 #pragma omp parallel for 上方添加以下内容会将 OMP 限制为三个线程,无论是否有更多线程可用。

#pragma omp parallel num_threads(3)
#pragma omp for
for (i = 0; i < N; i++)
    a[i] = 2 * i;

还可以在一定程度上控制多处理器(多个插槽)系统中不同处理器之间的工作调度方式。 OpenMP and NUMA relation?

您可能还会发现以下指南很有用,Guide into OpenMP: Easy multithreading programming for C++。

【讨论】:

+1, "OMP 调度程序将根据多种因素选择使用哪些核心(真实或 HT),包括它们的负载、分配给它的工作量以及您可能有的任何提示假如。”你有没有关于这方面的一些细节的消息来源?我真的很想知道更多关于这方面的信息。如果您看到这个问题***.com/questions/21792738/… 我试图猜测 OpenMP 在做什么,因此了解更多信息会很有帮助。 我认为这不是 OMP 标准的一部分。它特定于 OS 调度程序和您使用的 OMP 版本实现的调度程序。

以上是关于使用 openMP 进行多核处理与多线程的主要内容,如果未能解决你的问题,请参考以下文章

单核和多核,单进程和多进程,单线程与多线程

Python多线程与多进程

极智Coding | OpenMP 多线程使用

协程(Coroutine)与多线程,多进程

OpenMP使用体验报告(概述)

python-学习-python并发编程之多进程与多线程