我正在使用NVIDIA CUDA 11.2的OpenCL库(及其C++绑定(构建一个OpenCL程序。在成功调用cl::Program::build()
之后,对于单个设备(传递具有单个设备索引的向量(,我获得生成的";二进制文件";大小使用:built_program.getInfo<CL_PROGRAM_BINARY_SIZES>()
,这也成功了,但给了我3个值:一个非零值和两个零。当我打印第一个二进制文件时,我看到了我期望的PTX代码。
我的问题是:为什么要给我两个(空的(额外的二进制文件?
即使程序是为您指定的特定设备构建的(请参阅clBuildProgram的文档(,二进制文件也可用于上下文中的每个设备。在您的情况下,您的系统上可能有三个GPU;您为单个设备构建了程序,因此对于三个设备中的一个,您会看到一个非空的PTX。
困惑?当然晦涩难懂的对但这完全没有意义吗?诚然,不是真的。
进一步挖掘,这似乎甚至有官方记录(重点是我的(:
返回一个数组,该数组包含与程序关联的每个设备的程序二进制文件(可以是可执行二进制文件、编译二进制文件或库二进制文件(的字节大小数组的大小是与程序关联的设备数量。如果二进制文件对设备不可用,则返回大小为零的值。
不是为其构建的每个设备,而是与程序相关的每个设备;它可能是OpenCL上下文中用于创建程序的每个设备。