2. 基本用法

2.1. 链接 libdevice

libdevice 库以 LLVM bitcode 库的形式发布,旨在编译过程早期与目标模块链接。与 libdevice 链接的标准流程是首先将其与目标模块链接,然后运行标准的 LLVM 优化和代码生成过程。这允许优化器内联并对使用的库函数执行分析,并消除任何未使用的函数作为死代码。

libnvvm 的用户可以通过将适当的 libdevice 模块添加到nvvmProgram正在编译的对象来与 libdevice 链接。此外,以下用于nvvmCompileProgram的选项会影响 libdevice 函数的行为

表 1. 支持的反射参数
参数 描述
-ftz 0(默认) 在执行单精度浮点运算时,保留非规格化值
1 在执行单精度浮点运算时,将非规格化值刷新为零
-prec-div 0 对单精度浮点除法和倒数使用更快的近似计算
1(默认) 对单精度浮点除法和倒数使用 IEEE 最近舍入模式
-prec-sqrt 0 对单精度浮点平方根使用更快的近似计算
1(默认) 对单精度浮点平方根使用 IEEE 最近舍入模式

以下伪代码展示了使用 libnvvm 将 NVVM IR 模块与 libdevice 库链接的示例

nvvmProgram prog;
size_t libdeviceModSize;

const char *libdeviceMod = loadFile('/path/to/libdevice.*.bc',
                                    &libdeviceModSize);
const char *myIr = /* NVVM IR in text or binary format */;
size_t myIrSize = /* size of myIr in bytes */;

// Create NVVM program object
nvvmCreateProgram(&prog);

// Add libdevice module to program
nvvmAddModuleToProgram(prog, libdeviceMod, libdeviceModSize);

// Add custom IR to program
nvvmAddModuleToProgram(prog, myIr, myIrSize);

// Declare compile options
const char *options[] = { "-ftz=1" };

// Compile the program
nvvmCompileProgram(prog, 1, options);

客户端程序有责任定位和读取 libdevice 库二进制文件(在示例中由loadFile函数表示)。