运行 不同的内核是否不同于 OpenMP 中的 运行 不同的线程?
Is running with different cores different from running with different thread in OpenMP?
要使用已知数量的线程并行执行一段代码,我们通常这样做:
#pragma omp parallel num_threads(8)
{}
但是,我们如何设置核心数而不是线程数?这些有什么不同吗?
TL;DR: 您不能在 OpenMP 预处理指令中直接指定内核数,但您可以控制 OpenMP 线程的映射方式 在可用内核上。
工作原理:
应用程序可以在 运行 时间动态创建和销毁软件线程。
它们 映射 硬件资源,例如硬件线程和内核,对于给定平台,这些资源在 运行 时间是固定的。
您不能直接控制内核(在用户 space 中),只能控制线程。
在 OpenMP 中,您可以使用多种方法在 运行 时控制线程数:
- 预处理指令中的
num_threads
子句
OMP_NUM_THREADS
环境变量
omp_set_num_threads
运行时间函数
OpenMP 使用 places 抽象硬件层次结构。它将位置定义为“一个或多个 OpenMP 线程可以在其上执行的设备的一组无序的实现定义的硬件单元”。实际上,位置通常是 CPU 上的一组硬件线程。有效位置的示例包括给定的硬件插槽、三个特定的内核或一个特定的硬件线程(多个位置可以共享相同的硬件执行单元)。可以使用 OMP_PLACES
环境变量手动设置位置。
可以使用环境变量 OMP_PROC_BIND
或最近使用预处理并行指令中的子句 proc_bind
来控制要放置的 OpenMP 线程的 mapping/binding。例如,您可以强制将 OpenMP 线程绑定到位置,或者在它们之间均匀分布。
示例:
如果要使用4核,可以使用以下环境:
OMP_PLACES="cores(4)"
OMP_PROC_BIND=close
OpenMP 运行time 将任意 select 硬件的 4 个内核并在其上执行线程,以便第一个线程将 运行 在第一个内核上,第二个线程在第二个核心上,等等。如果有 8 个线程,那么 4 个核心中的每一个都将执行两个 OpenMP 线程(即使您的处理器有 8 个核心)。
要使用已知数量的线程并行执行一段代码,我们通常这样做:
#pragma omp parallel num_threads(8)
{}
但是,我们如何设置核心数而不是线程数?这些有什么不同吗?
TL;DR: 您不能在 OpenMP 预处理指令中直接指定内核数,但您可以控制 OpenMP 线程的映射方式 在可用内核上。
工作原理:
应用程序可以在 运行 时间动态创建和销毁软件线程。 它们 映射 硬件资源,例如硬件线程和内核,对于给定平台,这些资源在 运行 时间是固定的。 您不能直接控制内核(在用户 space 中),只能控制线程。
在 OpenMP 中,您可以使用多种方法在 运行 时控制线程数:
- 预处理指令中的
num_threads
子句 OMP_NUM_THREADS
环境变量omp_set_num_threads
运行时间函数
OpenMP 使用 places 抽象硬件层次结构。它将位置定义为“一个或多个 OpenMP 线程可以在其上执行的设备的一组无序的实现定义的硬件单元”。实际上,位置通常是 CPU 上的一组硬件线程。有效位置的示例包括给定的硬件插槽、三个特定的内核或一个特定的硬件线程(多个位置可以共享相同的硬件执行单元)。可以使用 OMP_PLACES
环境变量手动设置位置。
可以使用环境变量 OMP_PROC_BIND
或最近使用预处理并行指令中的子句 proc_bind
来控制要放置的 OpenMP 线程的 mapping/binding。例如,您可以强制将 OpenMP 线程绑定到位置,或者在它们之间均匀分布。
示例:
如果要使用4核,可以使用以下环境:
OMP_PLACES="cores(4)"
OMP_PROC_BIND=close
OpenMP 运行time 将任意 select 硬件的 4 个内核并在其上执行线程,以便第一个线程将 运行 在第一个内核上,第二个线程在第二个核心上,等等。如果有 8 个线程,那么 4 个核心中的每一个都将执行两个 OpenMP 线程(即使您的处理器有 8 个核心)。