2. 基础用法
2.1. 链接libdevice库
libdevice库以LLVM位码库的形式提供,旨在在编译过程的早期阶段与目标模块链接。与libdevice链接的标准流程是首先将其与目标模块链接,然后运行标准的LLVM优化和代码生成过程。这使得优化器能够内联并对所使用的库函数进行分析,并将任何未使用的函数作为死代码消除。
libnvvm 的用户可以通过将相应的 libdevice 模块添加到正在编译的 nvvmProgram 对象中来链接 libdevice。此外,nvvmCompileProgram 的以下选项会影响 libdevice 函数的行为:
| 参数 | 取值 | 描述 |
|---|---|---|
| -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函数表示)。