2. 基本用法
2.1. 链接 libdevice
libdevice 库以 LLVM bitcode 库的形式发布,旨在编译过程早期与目标模块链接。与 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函数表示)。