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函数表示)。