跳过导航链接 | |
退出打印视图 | |
Oracle Solaris Studio 12.3:OpenMP API 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
通过处理器绑定,程序员可指示操作系统在整个程序执行期间在同一处理器上运行该程序中的线程。
在将处理器绑定与静态调度一起使用时,将有益于展示某个数据重用模式的应用程序,在该模式中,由并行区域或工作共享区域中的线程访问的数据将位于上次调用的并行区域或工作共享区域的本地缓存中。
从硬件的角度看,计算机系统是由一个或多个物理处理器组成的。从操作系统的角度看,其中每个物理处理器都映射到可运行程序中的线程的一个或多个虚拟处理器。如果 n 个虚拟处理器可用,则可同时调度运行 n 个线程。根据系统的不同,虚拟处理器可能是处理器、内核、硬件线程等。
例如,SPARC T3 物理处理器具有八个内核,每个内核可运行八个同时进行处理的线程。从 Oracle Solaris 系统的角度看,共有 64 个虚拟处理器,可以在其中调度要运行的线程。在 Oracle Solaris 平台上,可以使用 psrinfo(1M) 命令来确定虚拟处理器的数量。在 Linux 系统上,文本文件 /proc/cpuinfo 提供有关可用处理器的信息。
当操作系统将线程绑定到处理器时,实际上是将线程绑定到特定的虚拟处理器而不是物理处理器。
设置 SUNW_MP_PROCBIND 环境变量,可以绑定 OpenMP 程序中的线程。为 SUNW_MP_PROCBIND 指定的值可以是下列值之一:
字符串 "TRUE"、"FALSE"、"COMPACT" 或 "SCATTER"(或小写的 "true"、"false"、"compact" 或 "scatter")。例如:% setenv SUNW_MP_PROCBIND "TRUE"
非负整数。例如,% setenv SUNW_MP_PROCBIND "2"
由一个或多个空格分隔的两个或更多非负整数的列表。例如,如果使用四个线程,则 % setenv SUNW_MP_PROCBIND "2 2 4 6" 将两个线程绑定到处理器 2,一个绑定到处理器 4,另一个绑定到处理器 6。
两个非负整数 n1 和 n2,二者之间由减号 ("-") 分隔。n1 必须小于或等于 n2。例如,% setenv SUNW_MP_PROCBIND "0-6"
请注意,上文提到的非负整数表示逻辑标识符 (ID)。逻辑 ID 可能不同于虚拟处理器 ID。下一节将介绍二者之间的差异。
系统中的每个虚拟处理器都有唯一的处理器 ID。Oracle Solaris psrinfo(1M) 命令显示有关系统中虚拟处理器的信息,包括其虚拟处理器 ID。prtdiag(1M) 命令显示系统配置和诊断信息。
可以使用 psrinfo -pv 列出系统中的所有物理处理器以及与每个物理处理器关联的虚拟处理器。
虚拟处理器 ID 可能是连续的,但也可能是不连续的。例如,在具有 8 个 UltraSPARC IV 处理器(16 个内核)的 Sun Fire 4810 上,虚拟处理器 ID 可能是:0、1、2、3、8、9、10、11、512、513、514、515、520、521、522、523。
另一方面,逻辑处理器 ID 是从 0 开始的连续整数。如果系统中可用的虚拟处理器数为 n,则其逻辑 ID 为 0、1、...、n-1(按 psrinfo(1M) 显示的顺序)。
有关 SUNW_MP_PROCBIND 接受的值的解释,请参见2.3.2 解释为 SUNW_MP_PROCBIND 指定的值。
如果为 SUNW_MP_PROCBIND 指定的目标为 FALSE,线程将不绑定到任何处理器。这是缺省设置。
如果为 SUNW_MP_PROCBIND 指定的值为 TRUE,线程将以循环(共享)方式绑定到虚拟处理器。绑定的起始处理器由运行时库以获得最佳性能为目标进行确定。
如果为 SUNW_MP_PROCBIND 指定的值为 COMPACT,则线程将被绑定到系统中最靠近的虚拟处理器。COMPACT 允许线程共享数据高速缓存,从而改进数据局域性。
如果为 SUNW_MP_PROCBIND 指定的值为 SCATTER,线程将被绑定到远离的虚拟处理器。这将允许每个线程具有更高的内存带宽。SCATTER 与 COMPACT 相反。
如果为 SUNW_MP_PROCBIND 指定的值是非负整数,则该整数表示线程应绑定到的虚拟处理器的起始逻辑 ID。线程会从具有指定逻辑 ID 的处理器开始,以循环方式绑定到虚拟处理器,在绑定到逻辑 ID 为 n-1 的处理器后,返回到逻辑 ID 为 0 的处理器。
如果为 SUNW_MP_PROCBIND 指定的值是包含两个或更多非负整数的列表,则线程将以循环方式绑定到具有指定逻辑 ID 的虚拟处理器。将不会使用其逻辑 ID 不是指定逻辑 ID 的处理器。
如果为 SUNW_MP_PROCBIND 指定的值是用减号 ("-") 分隔的两个非负整数,则线程将以循环方式绑定到如下范围的虚拟处理器:以第一个逻辑 ID 开头,并以第二个逻辑 ID 结尾。将不会使用其逻辑 ID 在此范围之外的处理器。
如果为 SUNW_MP_PROCBIND 指定的值不符合上述任何一种形式,或者给定的逻辑 ID 无效,则会发出一条错误消息,并终止程序的执行。
如果 OpenMP 程序中的线程数大于可用的虚拟处理器数,则一些虚拟处理器将绑定多个线程。这可能会对性能有负面影响。
在 Oracle Solaris 平台上使用 psrset 实用程序,或者在 Linux 平台上使用 taskset 命令,可以指定处理器集。SUNW_MP_PROCBIND 没有将处理器集考虑在内。如果您使用处理器集,则您应负责确保 SUNW_MP_PROCBIND 的设置与所用的处理器集一致。否则,在 Linux 系统上,SUNW_MP_PROCBIND 的设置将覆盖处理器集设置,而在 Oracle Solaris 系统上,将会发出错误消息。