Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

功能系列试验

正常情况下,设计和生成目标文件是为了能在给定体系结构的所有系统上执行该目标文件。但是,经常要对具有特殊功能的个别系统进行优化。可以使用之前各节介绍的机制,用代码需要执行的功能来标识经过优化的代码。

要测试经过优化的实例,必须使用可提供所需功能的系统。对于每个系统,运行时链接程序会确定可用的功能,然后选择功能最强的实例。为帮助进行测试和实验,可以让运行时链接程序使用替代功能集合,而不是系统提供的功能集合。此外,可以指定应仅根据这些替代功能验证特定文件。

替代功能集合源自系统功能,可以重新初始化,也可以添加或删除功能。

以下环境变量系列可用于创建并计划使用替代功能集合。

LD_PLATCAP={name}

标识替代平台名称。

LD_MACHCAP={name}

标识替代计算机硬件名称。

LD_HWCAP=[+-]{token | [index]number},....

标识替代硬件功能值。

LD_SFCAP=[+-]{token | [index]number},....

标识替代软件功能值。

LD_CAP_FILES=file,....

标识应根据替代功能进行验证的文件。

功能环境变量 LD_PLATCAPLD_MACHCAP 分别接受定义平台名称的字符串和定义计算机硬件名称的字符串。请参见标识平台功能标识计算机功能

功能环境变量 LD_HWCAPLD_SFCAP 接受逗号分隔的标记列表作为功能的符号表现形式。请参见标识硬件功能标识软件功能。标记也可以是数值。要为不同的掩码(例如 CA_SUNW_HW_1CA_SUNW_HW_2)设置数值,可在数字前加上用方括号括起来的索引。例如,LD_HWCAP=[2]0x80CA_SUNW_HW_2 设置为值 0x80。如果未指定索引,则采用 1。无效索引将被忽略。

"+" 前缀将导致将其后的功能添加到替代功能中。"-" 前缀将导致从替代功能中删除其后的功能。缺少 "+-" 将导致其后的功能替换替代功能。

删除某个功能会导致增加对要模拟的功能环境的限制。通常情况下,当功能实例系列可用时,还会提供一个非特定于功能的通用实例。因此,可以使用限制程度较高的功能环境来强制使用功能较弱的代码实例或通用代码实例。

添加功能会导致进一步强化要模拟的功能环境。应谨慎创建此环境,但可将其用于测试某个功能系列的框架。例如,可以创建函数系列以使用 mapfile 定义其预期功能。这些函数可以使用 printf(3C) 确认其执行情况。然后,采用各种功能组合验证并测试关联目标文件的创建。在对函数的实际功能要求进行编码之前,功能系列的此原型设计可以证明是有用的。不过,如果实例系列中的代码要求正确执行特定功能,但系统并未提供此功能,而是将其设置为替代功能,那么代码实例将无法正确执行。

如果建立替代功能集合时未使用 LD_CAP_FILES,那么会针对替代功能对进程的所有特定于功能的目标文件进行验证。此方法也应谨慎使用,因为许多系统目标文件要求正确执行系统功能。功能的任何更改都可能导致系统目标文件无法正确执行。

功能实验的最佳环境是使用可提供目标文件要使用的所有功能的系统。还应当使用 LD_CAP_FILES 来隔离您要实验的目标文件。随后可以使用 "-" 语法禁用功能,从而使得能够试验功能系列的各种实例。系统的真实功能会完全支持每个实例。

例如,假设有两个 x86 功能目标文件 libfoo.solibbar.so。这些目标文件包含针对 SSE2 指令进行优化的功能函数、针对 MMX 指令进行优化的函数,以及不需要功能的通用函数。底层系统同时提供了 SSE2MMX。缺省情况下,使用经过全面优化的 SSE2 函数。

可以使用 LD_HWCAP 定义删除 SSE2 功能,从而限制 libfoo.solibbar.so 使用针对 MMX 指令进行优化的函数。定义 LD_CAP_FILES 最灵活的方法是使用所需文件的基名。

$ LD_HWCAP=-sse2 LD_CAP_FILES=libfoo.so,libbar.so  ./main

可以通过删除 SSE2MMX 功能,进一步将 libfoo.solibbar.so 限制为仅使用通用函数。

$ LD_HWCAP=-sse2,mmx LD_CAP_FILES=libfoo.so,libbar.so  ./main

注 -  可以使用运行时链接程序诊断来观察应用程序的可用功能以及已设置的所有替代功能。
$ LD_DEBUG=basic LD_HWCAP=-sse2,mmx,cx8  ./main
....
02328: hardware capabilities (CA_SUNW_HW_1) - 0x5c6f  \
    [ SSE3 SSE2 SSE FXSR MMX CMOV SEP CX8 TSC FPU ]
02328: alternative hardware capabilities (CA_SUNW_HW_1) - 0x4c2b  \
    [ SSE3 SSE FXSR CMOV SEP TSC FPU ]
....