Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

5.2.1 控制 OpenMP 4.0 中的线程关联性

本节详细介绍 OpenMP 4.0 规范中的 2.5.2 节“控制 OpenMP 线程关联性”。

当线程遇到包括 proc_bind 子句的并行构造时,OMP_PROC_BIND 环境变量用于确定将线程绑定到位置的策略。如果并行构造包括 proc_bind 子句,则 proc_bind 子句指定的绑定策略将覆盖 OMP_PROC_BIND 指定的策略。组中的线程分配到某个位置后,实现不会将其移到其他位置。

master 线程关联性策略指示执行环境将组中的每个线程分配到与主线程相同的位置。此策略不会更改位置分区,且每个隐式任务将继承父隐式任务的 place-partition-var 内部控制变量 (Internal Control Variable, ICV)。

close 线程关联性策略指示执行环境将组中的线程分配到靠近父线程位置的位置。此策略不会更改位置分区,且每个隐式任务将继承父隐式任务的 place-partition-var ICV。如果 T 指组中的线程数量,P 指父线程所在位置分区中的位置数量,那么将按以下方法将组中的线程分配到位置:

  • T <= P。主线程在父线程(即遇到并行构造的线程)的位置上执行。下一个线程编号最小的线程在位置分区的下一个位置上执行,以此类推,相对主线程的位置分区进行绕回分配。

  • T > P。每个位置 P 将包含 Sp 个线程编号连续的线程,其中 floor(T/P) <= Sp <= ceiling(T/P)。前 S0 个线程(包括主线程)分配到父线程的位置。接下来的 S1 个线程分配到位置分区的下一个位置,以此类推,相对主线程的位置分区进行绕回分配。当 P 不能整除 T 时,特定位置的具体线程数由实现定义。

spread 线程关联性策略的目的是将一组 T 个线程稀疏地分布到父线程所在位置分区的 P 个位置。要实现稀疏分布,首先将父分区分割为 T 个子分区(如果 T <= P)或 P 个子分区(如果 T > P)。然后,将一个线程 (T <= P) 或一组线程 (T > P) 分配到每个子分区。每个隐式任务的 place-partition-var ICV 均设置为其子分区。分割为子分区不仅是实现稀疏分布的机制,还定义了在创建嵌套并行区域时可供线程使用的位置子集。将线程分配到位置的方法如下所示:

  • T <= P。父线程的位置分区拆分为 T 个子分区,其中每个子分区包含 floor(P/T) 个或 ceiling(P/T) 个连续位置。向每个子分区分配一个线程。主线程在父线程的位置上执行,并分配到包含该位置的子分区。下一个线程编号最小的线程分配到下一个子分区的第一个位置,以此类推,相对主线程的原始位置分区进行绕回分配。

  • T > P。父线程的位置分区拆分为 P 个子分区,每个子分区包含一个位置。每个子分区分配有 Sp 个线程编号连续的线程,其中 floor(T/P) <= Sp <= ceiling(T/P)。前 S0 个线程(包括主线程)分配到包含父线程位置的子分区。接下来的 S1 个线程分配到下一个子分区,以此类推,相对主线程的原始位置分区进行绕回分配。当 P 不能整除 T 时,特定子分区中的具体线程数由实现定义。


注 -  如果在未分配完所有线程前就到达分区位置的末端,则需要绕回分配机制。例如,在采用 close 策略且 T <= P 时,如果主线程分配到位置分区中第一个位置以外的位置,那么就有可能需要绕回分配机制。在这种情况下,线程 1 分配到主线程位置之后的位置,线程 2 分配到线程 1 位置之后的位置,以此类推。这样,可能在未分配完所有线程前,就已到达位置分区的末端。在这种情况下,将继续从位置分区的第一个位置开始分配线程。