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

时间:2014-02-07 17:24:17

标签: multithreading multiprocessing openmp multicore

这个问题可能听起来很基本但是,我找不到任何具体的答案。所以现在说我们有一个多核处理器,比如corei5 680(2个物理内核,HT支持4个可用内核)。 我的问题是openMP恰好适合图片? 1 - 当我们说使用openMP进行多线程时它会自动使用所有可用内核(在这种情况下为4个虚拟内核)并根据可用的CPU周期执行线程吗? 2 - openmp是否可以控制如何使用物理/虚拟核心?或者它是抽象的,并提供像java一样的多线程环境?

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

由于

1 个答案:

答案 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定义了连续迭代的数量   一次分配给一个线程的。

     

指导:很大一部分   连续迭代动态地分配给每个线程(如   以上)。每个连续的块大小呈指数下降   分配到参数块

中指定的最小大小

来自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++