2. 基础用法

2.1. 链接libdevice库

libdevice库以LLVM位码库的形式提供,旨在在编译过程的早期阶段与目标模块链接。与libdevice链接的标准流程是首先将其与目标模块链接,然后运行标准的LLVM优化和代码生成过程。这使得优化器能够内联并对所使用的库函数进行分析,并将任何未使用的函数作为死代码消除。

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

Table 1. Supported Reflection Parameters
参数 取值 描述
-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函数表示)。