这个问题听起来可能是基本的,但是我找不到任何具体答案。因此,现在说我们有一个像corei5 680(2个物理内核,并启用HT启用4个可用核心的多项处理器)。我的问题是,OpenMP完全适合图片中?1-当我们说使用OpenMP的多线程时,它会自动使用所有可用的内核(在这种情况下为4个虚拟内核)并根据可用的CPU周期执行线程吗?2- OpenMP是否提供了如何使用物理/虚拟内核的控制?还是抽象并提供了像java一样的mutlithreading环境?
如果听起来很基本,请原谅我,但我试图在网上找到答案,但找不到任何令人满意的。
谢谢
这取决于您正在考虑的OpenMP的哪个版本/功能,因为我相信以后的版本可能会为您提供更多功能,但原始库是围绕数据并行for
Primations构建的。一般而言,OpenMP和其他数据并行编程模型尝试将基础硬件抽象,并且程序员将其计算声明为一系列数据操作,然后由OMP安排。
要回答您的第一个问题OS调度程序将安排跨核心线程,OMP调度程序将安排在可用线程的工作。
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
OMP调度程序将根据许多因素,包括其负载,给它的工作量以及您可能提供的任何提示,选择要使用的内核(真实或HT)。人们会期望上面的代码在所有可用内核上运行(示例中的4个)
您可以使用schedule
关键字来控制调度程序如何分配工作。
计划(键入,块):如果工作共享结构为 do-loop或for-loop。工作共享结构中的迭代 根据根据计划方法定义的调度方法分配给线程 这个条款。调度的三种类型是:
静态:在这里,所有 线程在执行循环之前分配了迭代 迭代。迭代将线程平均划分为 默认。但是,指定参数块的整数将 将块数量连续迭代分配给特定线程。
动态:在这里,某些迭代分配给较小 线程数。一旦特定线程完成了分配的 迭代,它返回以从迭代中获得另一个 左边。参数块定义了连续迭代的数量 一次分配给线程。
指导:很大一部分 连续迭代均动态分配给每个线程(如 多于)。块大小随连续的连续 分配到参数块中指定的最小尺寸
来自Wikipedia
解决您的第二个问题。您也可以使用num_threads
属性来指定要使用的线程数。示例中的#pragma omp parallel for
上方添加以下内容将限制为三个线程,而不管是否有更多可用。
#pragma omp parallel num_threads(3)
#pragma omp for
for (i = 0; i < N; i++)
a[i] = 2 * i;
也可以在某种程度上控制多个处理器(多个插座)系统中不同处理器的工作时间。OpenMP和NUMA关系?
您可能还会发现以下指南有用,指南openMP:C 的易于多线程编程。