跳转至

clBuildProgram

1. 介绍

对于使用延迟编译的编译器(如VIR),clBuildProgram只是将C(clCreateProgramWithSource加载源码)或可读SPIRV形式的源码文本文件(clCreateProgramWithIL加载源码),编译成二进制形式的SPIRV文件,并记录转换后的VIR。后续将spirv编译成真正的二进制发生在clCreateKernel()函数中。

以下是SPIRV文件的魔法数(前四个字节)和版本(后四个字节)

Bash
$ hexdump -n 8 -C vector_add.bin
00000000  03 02 23 07 00 04 01 00                           |..#.....|
00000008


结合前 8 字节的信息,可以进一步分析:
 4 字节 03 02 23 07 确实匹配 SPIRV 的魔法数(小端存储的 0x07230203),符合 SPIRV 文件的基本标识。
 5-8 字节(版本号字段)为 00 04 01 00,按小端字节序解析为 32 位无符号整数 0x00010400,对应 SPIRV 的版本号 1.4(版本号格式为 0x000Vv000,其中 V 是主版本,v 是次版本,这里 0x00010400 即主版本 1、次版本 4),属于 SPIRV 规范中合法的版本(当前主流版本支持 1.0 及以上)。
目前前 8 字节完全符合 SPIRV 头部的规范(魔法数 + 有效版本号),基本可以初步判定这是一个 SPIRV 文件。
若要完全确认,可进一步查看第 9-12 字节(生成器字段),只要是合法的 32 位无符号整数(无异常值如全 0xff),且文件整体结构通过 spirv-val 工具验证,即可 100% 确认。