这个问题可能听起来很基本但是,我找不到任何具体的答案。所以现在说我们有一个多核处理器,比如corei5 680(2个物理内核,HT支持4个可用内核)。 我的问题是openMP恰好适合图片? 1 - 当我们说使用openMP进行多线程时它会自动使用所有可用内核(在这种情况下为4个虚拟内核)并根据可用的CPU周期执行线程吗? 2 - openmp是否可以控制如何使用物理/虚拟核心?或者它是抽象的,并提供像java一样的多线程环境?
如果这听起来很基本,请原谅我,但我试图在网上找到答案,但找不到任何令人满意的答案。
由于
答案 0 :(得分:2)
这取决于您正在考虑的OpenMP版本/功能,因为我相信更高版本可能会为您提供更多功能,但原始库是围绕数据并行for
灵长类型构建的。通常,OpenMP和其他数据并行编程模型尝试抽象出底层硬件,程序员将其计算声明为对OMP调度的数据的一系列操作。
为了回答您的第一个问题,OS调度程序将调度跨核心的线程,OMP调度程序将调度可用线程的工作。
#pragma omp parallel for
for (i = 0; i < N; i++)
a[i] = 2 * i;
OMP调度程序将根据许多因素选择要使用的核心(真实或HT),包括负载,给予的工作量以及您可能提供的任何提示。可以预期上面的代码将在所有可用内核上运行(在您的示例中为4)
您可以使用schedule
关键字来控制调度程序分配工作的方式。
schedule(type,chunk):如果工作共享构造是,这很有用 do循环或for循环。工作共享构造中的迭代 根据定义的调度方法分配给线程 这个条款。三种类型的安排是:
静态:在这里,所有的 线程在执行循环之前被分配迭代 迭代。迭代在线程之间平均分配 默认。但是,为参数块指定一个整数将 将大量连续迭代分配给特定线程。
dynamic:在这里,一些迭代被分配给更小的 线程数。一旦特定线程完成其分配 迭代,它返回从迭代中得到另一个 剩下。参数chunk定义了连续迭代的数量 一次分配给一个线程的。
指导:很大一部分 连续迭代动态地分配给每个线程(如 以上)。每个连续的块大小呈指数下降 分配到参数块
中指定的最小大小
解决你的第二个问题。您还可以使用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++。