在OpenMP中,使用不同的内核运行与使用不同的线程运行不同吗



要使用已知数量的线程并行执行一段代码,我们通常会这样做:

#pragma omp parallel num_threads(8)
{}

然而,我们如何设置核心数量而不是线程数量?这些不同吗?

TL;DR:您不能在OpenMP预处理指令中直接指定多个内核,但您可以控制OpenMP线程在可用内核上的映射方式。

工作原理:

软件线程可以在运行时由应用程序动态创建和销毁。它们被映射到硬件资源上,如硬件线程和内核,这些资源在给定平台的运行时是固定的。您不能直接控制核心(在用户空间中(,只能控制线程。

在OpenMP中,您可以使用以下几种方法控制运行时的线程数:

  • 预处理指令中的num_threads子句
  • OMP_NUM_THREADS环境变量
  • omp_set_num_threads运行时函数

OpenMP使用位置抽象硬件层次结构。它将一个地方定义为";一个或多个OpenMP线程可以在其上执行的设备的实现定义的硬件单元的无序集合";。在实践中,位置通常是CPU上的一组硬件线程。有效位置的示例包括给定的硬件套接字、三个特定的内核或一个特定的硬件线程(多个位置可以共享相同的硬件执行单元(。可以使用OMP_PLACES环境变量手动设置位置。

OpenMP线程到位置的映射/绑定可以使用环境变量OMP_PROC_BIND来控制,或者最近使用预处理并行指令中的子句proc_bind来控制。例如,可以强制OpenMP线程绑定到某个位置,或者在这些位置之间均匀分布。

示例:

如果你想使用4核,你可以使用以下环境:

OMP_PLACES="cores(4)"
OMP_PROC_BIND=close

OpenMP运行时将任意选择硬件的4个核心并在其上执行线程,以便第一个线程在第一个核心上运行,第二个线程在第二个核心上,等等。如果有8个线程,那么4个核心中的每一个都将执行两个OpenMP线程(即使您有一个有8个核心的处理器(。

最新更新